Warum scheitern sed mit internationalen Zeichen und wie sie zu beheben?
-
09-06-2019 - |
Frage
GNU sed Version 4.1.5 scheint mit internationalen Zeichen zum Scheitern verurteilt. Hier ist meine Eingabedatei:
Gras Och Stenar Trad - Von Moja nach Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - Von Möja nach Minneapolis DVD [G2007DVD] 7812 | Y
(Beachten Sie den Umlaut in der zweiten Zeile.)
Und wenn ich
sed ‚s /.* | //‘ Ich würde erwarten, nur die X- und Y, um zu sehen, wie ich gefragt habe alle Zeichen bis zum entfernen ‚|‘ Raum und darüber hinaus. Stattdessen erhalte ich: X Ich weiß, ich tr verwenden kann die internationalen Zeichen zu entfernen. Zunächst aber gibt es eine Möglichkeit, nur sed zu benutzen?
Gras Och Stenar Trad - Von M? Y
Lösung
Ich denke, der Fehler tritt auf, wenn die Eingang Codierung der Datei von der bevorzugten Codierung Ihrer Umgebung unterscheidet.
Beispiel: in
ist UTF-8
$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X
Y
UTF-8 kann sicher als ISO-8859-1 interpretiert werden, werden Sie seltsame Zeichen bekommen, aber abgesehen davon, dass alles in Ordnung ist.
Beispiel: in
ist ISO-8859-1
$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Gras Och Stenar Trad - From MöY
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X
Y
ISO-8859-1 kann nicht als UTF-8 interpretiert werden, decodiert die Eingabedatei fehlschlägt. Das seltsame Spiel ist wahrscheinlich aufgrund der Tatsache, dass sed versucht eher zu erholen als völlig versagen.
Die Antwort basiert auf Debian Lenny / Sid und 4.1.5 sed.
Andere Tipps
sed
ist nicht sehr gut Setup für Nicht-ASCII-Text. Aber Sie (fast) den gleichen Code in perl
und erhalten das Ergebnis können Sie:
perl -pe 's/.*\| //' x