2008-09-15 12 views
15

GNU sedバージョン4.1.5が国際文字で失敗するようです。ここに私の入力ファイルがあります:なぜ国際的な文字でsedが失敗し、修正するのですか?

Gras Och Stenar Trad - MojaからMinneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad - MöjaからMinneapolis DVD [G2007DVD] 7812 | Y

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

SEDの/.*行います| // '< in

すべての文字を' | 'に削除するように要求したので、XとYのみが表示されます。それを超えた空間。代わりに、私は得る:

X
グラスOch Stenar Trad - From M? Y

私は国際的な文字を削除するtrを使用することができます知っています。まず、sedを使う方法はありますか?

+0

この問題は、GNU sed(バージョン4.2.2でテスト済み)で解決されているようです。 – sorontar

答えて

24

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

例:inは、UTF-8、UTF-8が安全にISO-8859-1として解釈することができ

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

、あなたは奇妙な文字を取得しますが、それを除けば、すべての罰金ですよです。

例:inは、入力ファイルが失敗した復号、

$ 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として解釈することができないISO-8859-1です。奇妙なマッチはおそらく、sedが完全に失敗するのではなく、回復しようとしているからです。

答えはDebian Lenny/Sidとsed 4.1.5に基づいています。

+0

それも動作し、私はsedを使用することができます。ありがとう! – Dave

9

sedは、非ASCIIテキストの設定があまりよくありません。あなたはperlに(ほぼ)同じコードを使用して結果を得ることができますしかし、あなたがしたい:

perl -pe 's/.*\| //' x 
+0

このヒントは非常に便利です。 –

関連する問題