为什么国际字符sed失败,如何解决?

GNU sed版本4.1.5似乎与国际字符失败。 这是我的input文件:

Gras Och Stenar Trad – 从Moja到Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad – 从Möja到Minneapolis DVD [G2007DVD] 7812 | ÿ

(注意第二行的变音符号。)

而当我这样做

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

我希望只看到X和Y,因为我已经要求删除所有字符,直到“|” 和超越它的空间。 相反,我得到:

X
Gras Och Stenar Trad – 从M? ÿ

我知道我可以用tr来删除国际字符。 首先,但是有没有办法使用sed?

我认为如果文件的输入编码与您的环境的首选编码不同,就会发生错误。

例如: in是UTF-8

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

UTF-8可以安全地解释为ISO-8859-1,你会得到奇怪的字符,但除了一切都很好。

例如: in是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 XY 

ISO-8859-1不能解释为UTF-8,解码输入文件失败。 奇怪的匹配可能是由于sed试图恢复而不是完全失败的事实。

答案是基于Debian Lenny / Sid和sed 4.1.5。

sed对于非ASCII文本设置不是很好。 然而,你可以在perl使用(几乎)相同的代码,并得到你想要的结果:

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