Ответы:
Просто используйте этот синтаксис:
sed 's/馑//g' file1
Или в экранированном виде:
sed "s/$(echo -ne '\u9991')//g" file1
(Обратите внимание, что старые версии Bash и некоторые оболочки не понимают echo -e '\u9991'
, поэтому проверьте сначала.)
sed
имеет модификатор g, он заменяет все вхождения, даже когда они следуют друг за другом. Также sed должен считать это как один символ, см .: echo -ne "馑" | wc -m
дает 1
. Если вы посчитаете bytes ( wc -c
), он вернется 3
. Правильно ли я понял ваш вопрос?
.
означает «один символ» или «один байт»?
echo 馑 | sed s/...//
дает мне 馑
(ничто не заменяется)
en_US.UTF-8
, но не под C
.
Perl может сделать это:
echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'
-CS
включает UTF-8 для стандартного ввода, вывода и ошибки.
Ряд версий sed
поддержки Unicode :
Я не смог найти информацию о BSD sed, что мне показалось странным, но я думаю, что есть хорошие шансы, что он также поддерживает Unicode. К сожалению, не существует стандартного способа определить, sed
какую кодировку использовать, поэтому каждый делает это по-своему.
Это работает для меня:
$ vim -nEs +'%s/\%u9991//g' +wq file1
Это капля более многословная, чем мне бы хотелось; вот полное объяснение:
-n
отключить файл подкачки vim-E
Ex улучшенный режим-s
бесшумный режим+'%s/\%u9991//g'
выполнить команду замещения+wq
Сохранить и выйтиfile1
на месте , это правильно?
В последних версиях BASH просто опускайте кавычки вокруг выражения sed, и вы можете использовать экранированные строки BASH. Пробелы в выражении sed или части выражения sed, которые могут быть интерпретированы BASH как символы подстановки, могут быть указаны в кавычках.
$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻
echo 馑 | sed s/...//
печатает что-нибудь?