Відповіді:
Просто використовуйте цей синтаксис:
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/...//
друкує щось?