Відповіді:
Просто використовуйте цей синтаксис:
sed 's/馑//g' file1
Або у втеченому вигляді:
sed "s/$(echo -ne '\u9991')//g" file1
(Зауважте, що старіші версії Bash та деяких оболонок не розуміють echo -e '\u9991', тому спочатку перевірте.)
sedмодифікатор g має місце, він замінює всі випадки, коли вони слідують один за одним. Також sed слід вважати це одним символом, див .: echo -ne "馑" | wc -mдає 1. Якщо порахувати байти ( 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 вимкнути файл swap vim-E Ex вдосконалений режим-s Режим тиші+'%s/\%u9991//g' виконати команду підстановки+wq зберегти та вийтиfile1 на місці , це правильно?
У останніх версіях BASH просто опустіть лапки навколо виразу sed і ви можете використовувати втечені рядки BASH. Проміжки в межах експресії sed або частини експресії sed, які можуть бути інтерпретовані BASH як макіяж, можуть бути окремо цитовані.
$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻
echo 馑 | sed s/...//друкує щось?