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
Gras Och Stenar Trad - Von M? Y

Ich weiß, ich tr verwenden kann die internationalen Zeichen zu entfernen. Zunächst aber gibt es eine Möglichkeit, nur sed zu benutzen?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top