为什么sed在处理国际字符时会失败,如何解决?

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

(注意第二行中的分音符。)

当我这样做时

sed 's/.*| //' < in
我期望只看到 XY,因为我已要求删除从 '|' 开始及其后的所有字符和空格。但事实上,我得到了:
X<br>
Gras Och Stenar Trad - From M? Y

我知道可以使用 tr 命令来删除国际字符,但是是否有办法只使用 sed


这个问题似乎已经通过GNU sed解决了(在版本4.2.2上进行了测试)。 - user8017719
2个回答

25

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

例如:in是UTF-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,你会得到一些奇怪的字符,但除此之外一切都没问题。

示例: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
X 
Y

ISO-8859-1不能被解释为UTF-8,因此无法解码输入文件。这种奇怪的匹配可能是因为sed试图恢复而不是完全失败。

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


12

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接