Gibt es eine Alternative zu sed, die Unicode unterstützt?

32

Zum Beispiel:

sed 's/\u0091//g' file1

Im Moment muss ich tun hexdump, um die Hex-Zahl zu bekommen und sedwie folgt zu setzen:

$ echo -ne '\u9991' | hexdump -C
00000000  e9 a6 91                                          |...|
00000003

Und dann:

$ sed 's/\xe9\xa6\x91//g' file1
A-letubby
quelle

Antworten:

27

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.)

Chaos
quelle
1
Zählt sed 馑 als ein Zeichen oder als 3? Das heißt, echo 馑 | sed s/...//druckt irgendetwas?
immibis
@immibis Da sedder 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 -mgives 1. Wenn Sie die Bytes ( wc -c) zählen, wird dies zurückgegeben 3. Habe ich deine Frage richtig verstanden?
Chaos
Ich meinte: .bedeutet "ein Zeichen" oder "ein Byte"?
immibis
@immibis Ich stimme mit einem Charakter überein, daher echo 馑 | sed s/...//gebe ich (nichts wird ersetzt)
Chaos
4
@chaos: Es funktioniert unter en_US.UTF-8, aber nicht unter C.
Choroba
15

Perl kann das:

echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'

-CS Aktiviert UTF-8 für Standardeingabe, -ausgabe und -fehler.

Choroba
quelle
7
Perl kann fast alles .....
wobbily_col
6

Eine Reihe von Versionen sedunterstützen Unicode :

  • Erbstück sed , das auf "originalem Unix-Material" basiert.
  • GNU sed ist eine eigene Codebasis.
  • Plan 9 sed , das auf Unix-ähnliche Betriebssysteme portiert wurde.

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, sedwelche Codierung verwendet werden soll.

Der Löffeligste
quelle
Unterstützen sie UTF-16 mit und ohne Stückliste?
Bon Ami,
10
UTF-16 ist in Unix-basierten Betriebssystemen ziemlich unbrauchbar. Es ist auch ein Gräuel, der niemals das Licht der Welt erblicken sollte.
Brian Bi
Ob sie UTF-16 unterstützen oder nicht, hängt von der Implementierung ab, und ich fürchte, ich habe diese Daten nicht. Ich bezweifle, dass Plan 9 sed dies tut (das ursprüngliche Betriebssystem ist überall UTF-8), aber ich kann nicht sicher sein, und selbst wenn dies nicht der Fall ist, könnten es die anderen tun.
The Spooniest
2

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ßen
Aryeh Leib Taurog
quelle
Ich nehme an, dies ändert sich file1 an Ort und Stelle , ist das richtig?
Gerrit
@ Gerrit das ist richtig, und danke für den Hinweis.
Aryeh Leib Taurog
0

Funktioniert für mich mit GNU sed (Version 4.2.1):

$ echo -ne $'\u9991' | sed 's/\xe9\xa6\x91//g' | hexdump -C
$ echo -ne $'\u9991' | hexdump -C
00000000  e9 a6 91

(Als weiterer Ersatz für sedSie könnte auch GNU verwendet werden awk; dies scheint jedoch nicht erforderlich zu sein.)

Janis
quelle
0

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
饥荐臻
Dave Rove
quelle