2008-09-15 31 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 | Ÿ

(注意在第二行中的变音。)

当我做

SED的/.* | //'< in

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

X
Gras Och Stenar Trad - From M? Y

我知道我可以用tr去掉国际字符。首先,但有没有办法使用sed?

+0

这个问题似乎已经用GNU sed解决了(在版本4.2.2上测试过)。 – sorontar 2016-11-23 22:36:15

回答

24

我认为,如果该文件的输入编码是从环境的首选编码不同的错误发生。

例子: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。

+0

这也适用,并允许我使用sed。谢谢! – Dave 2008-09-16 20:46:48

9

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

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

这个提示非常有用。 – 2016-03-18 18:23:59

相关问题