15

GNU sed version 4.1.5国際文字で失敗するようです。ここに私の入力ファイルがあります:

Gras Och Stenar Trad - From Moja to Minneapolis DVD [G2007DVD] 7812 | X
<br>
Gras Och Stenar Trad - From Möja to Minneapolis DVD [G2007DVD] 7812 | Y

(2 行目のウムラウトに注意してください。)

そして、私がするとき

sed 's/.*| //' < in

andまでのすべての文字とそれを超えるスペースを削除するように要求したため、 Xandのみが表示されると予想されます。代わりに、次のようになります。Y'|'

X<br>
Gras Och Stenar Trad - From M? Y

tr を使用して国際文字を削除できることはわかっています。まず、sedだけを使う方法はありますか?

4

2 に答える 2

26

ファイルの入力エンコーディングが環境の優先エンコーディングと異なる場合、エラーが発生すると思います。

例: inUTF-8

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X 
Y

UTF-8 は ISO-8859-1 として安全に解釈できます。奇妙な文字が表示されますが、それ以外はすべて問題ありません。

例: inis 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 は UTF-8 として解釈できず、入力ファイルのデコードに失敗します。奇妙な一致は、おそらく sed が完全に失敗するのではなく、回復しようとするためです。

答えは、Debian Lenny/Sid および sed 4.1.5 に基づいています。

于 2008-09-15T22:18:29.733 に答える
11

sedASCII 以外のテキストの設定がうまくいきません。ただし、(ほぼ) 同じコードを使用してperl、必要な結果を得ることができます。

perl -pe 's/.*\| //' x
于 2008-09-15T22:02:40.567 に答える