Linux 为什么sed在使用国际字符时失败,以及如何修复?

Linux 为什么sed在使用国际字符时失败,以及如何修复?,linux,internationalization,sed,character,Linux,Internationalization,Sed,Character,GNU-sed版本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 我知道我可以使用tr删除国际字符。首先,有没有办法只使用sed?sed对于非ASCII文本的设置不是很好。但是,您可以

GNU-sed版本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

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

sed
对于非ASCII文本的设置不是很好。但是,您可以在
perl
中使用(几乎)相同的代码,并获得所需的结果:

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

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

示例:中的
是UTF-8

$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X 
Y
ISO-8859-1不能解释为UTF-8,解码输入文件失败。这种奇怪的匹配可能是由于sed试图恢复,而不是完全失败


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

这个提示非常有用。这个问题似乎已经用GNU sed解决了(在版本4.2.2上测试)。
perl -pe 's/.*\| //' x
$ LANG=de_DE.UTF-8 sed 's/.*| //' < in
X
Y
$ LANG=de_DE.iso88591 sed 's/.*| //' < in
X 
Y
$ 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