Antworten:
Verwenden Sie einfach diese Syntax:
sed 's/馑//g' file1
Oder in der entkoppelten Form:
sed "s/$(echo -ne '\u9991')//g" file1
(Beachten Sie, dass ältere Versionen von Bash und einige Shells dies nicht verstehen echo -e '\u9991'
. Überprüfen Sie dies zuerst.)
sed
der Modifikator g hat, ersetzt er alle Vorkommen auch dann, wenn sie aufeinander folgen. Auch sed sollte es als ein Zeichen zählen, siehe: echo -ne "馑" | wc -m
gives 1
. Wenn Sie die Bytes ( wc -c
) zählen, wird dies zurückgegeben 3
. Habe ich deine Frage richtig verstanden?
.
bedeutet "ein Zeichen" oder "ein Byte"?
echo 馑 | sed s/...//
gebe ich 馑
(nichts wird ersetzt)
en_US.UTF-8
, aber nicht unter C
.
Perl kann das:
echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'
-CS
Aktiviert UTF-8 für Standardeingabe, -ausgabe und -fehler.
Eine Reihe von Versionen sed
unterstützen Unicode :
Ich konnte keine Informationen zu BSD sed finden, was ich seltsam fand, aber ich denke, die Chancen stehen gut, dass es auch Unicode unterstützt. Leider gibt es keine Standardmethode, um zu bestimmen, sed
welche Codierung verwendet werden soll.
Das funktioniert bei mir:
$ vim -nEs +'%s/\%u9991//g' +wq file1
Es ist ein Tropfen ausführlicher als ich möchte; Hier ist eine vollständige Erklärung:
-n
Deaktivieren Sie die VIM-Auslagerungsdatei-E
Ex verbesserter Modus-s
stiller Modus+'%s/\%u9991//g'
Führen Sie den Substitutionsbefehl aus+wq
speichern und schließenfile1
an Ort und Stelle , ist das richtig?
Lassen Sie bei neueren BASH-Versionen einfach die Anführungszeichen um den sed-Ausdruck weg, und Sie können die mit Escape-Zeichenfolgen versehenen BASH-Zeichenfolgen verwenden. Leerzeichen innerhalb des sed-Ausdrucks oder Teile des sed-Ausdrucks, die von BASH als Platzhalter interpretiert werden könnten, können einzeln in Anführungszeichen gesetzt werden.
$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻
echo 馑 | sed s/...//
druckt irgendetwas?