为什么 sed 在处理国际字符时失败以及如何修复?
-
09-06-2019 - |
题
GNU sed 版本 4.1.5 似乎无法处理国际字符。这是我的输入文件:
Gras Och Stenar Trad-从Moja到Minneapolis DVD [G2007DVD] 7812 | X
Gras Och Stenar Trad-从Möja到明尼阿波利斯DVD [G2007DVD] 7812 | y
(注意第二行中的变音符号。)
当我这样做时
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
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。
其他提示
sed
对于非 ASCII 文本设置不是很好。但是,您可以在中使用(几乎)相同的代码 perl
并得到你想要的结果:
perl -pe 's/.*\| //' x
不隶属于 StackOverflow