为什么sed不能使用国际字符,以及如何解决?

时间:2020-03-05 18:54:39  来源:igfitidea点击:

GNU sed 4.1.5版本似乎因国际字符而失败。这是我的输入文件:

从Moja到Minneapolis的Gras Och Stenar传统DVD [G2007DVD] 7812 | X
从姆贾(M?ja)到明尼阿波利斯(Minneapolis)DVD的Gras Och Stenar传统[G2007DVD] 7812 | ÿ

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

当我做的时候

sed的/.* | //'<in

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

X
来自M的Gras Och Stenar传统? ÿ

我知道我可以使用tr删除国际字符。首先,但是有一种方法只能使用sed吗?

解决方案

回答

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

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

回答

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

示例:" 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进行的。