Odpowiedzi:
Po prostu użyj tej składni:
sed 's/馑//g' file1
Lub w postaci ucieczki:
sed "s/$(echo -ne '\u9991')//g" file1
(Pamiętaj, że starsze wersje Bash i niektóre powłoki nie rozumieją echo -e '\u9991'
, więc sprawdź najpierw.)
sed
ma modyfikator g, zastępuje wszystkie wystąpienia również wtedy, gdy podążają one za sobą. Również sed powinien liczyć się jako jedna postać, patrz: echo -ne "馑" | wc -m
daje 1
. Jeśli policzysz bajty ( wc -c
), to zwróci 3
. Czy dobrze zrozumiałem twoje pytanie?
.
oznacza „jeden znak” czy „jeden bajt”?
echo 馑 | sed s/...//
daje mi 馑
(nic nie jest zamieniane)
en_US.UTF-8
, ale nie działa C
.
Perl może to zrobić:
echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'
-CS
włącza UTF-8 dla standardowego wejścia, wyjścia i błędu.
Wiele wersji sed
obsługi Unicode :
Nie mogłem znaleźć informacji na temat BSD sed, co moim zdaniem było dziwne, ale myślę, że szanse są duże, że obsługuje także Unicode. Niestety nie ma standardowego sposobu na określenie, sed
którego kodowania użyć, więc każdy robi to na swój własny sposób.
To działa dla mnie:
$ vim -nEs +'%s/\%u9991//g' +wq file1
To kropla bardziej gadatliwa, niż bym chciał; oto pełne wyjaśnienie:
-n
wyłącz plik wymiany vim-E
Ex ulepszony tryb-s
tryb cichy+'%s/\%u9991//g'
wykonać polecenie podstawienia+wq
Zapisz i wyjdźfile1
na miejscu , czy to prawda?
W najnowszych wersjach BASH po prostu pomiń cudzysłowy wokół wyrażenia sed i możesz użyć znaków ucieczki BASH. Odstępy w obrębie wyrażenia sed lub części wyrażenia sed, które mogą być interpretowane przez BASH jako znaki wieloznaczne, które można indywidualnie cytować.
$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻
echo 馑 | sed s/...//
coś drukuje?