为啥 sed 会因国际字符而失败以及如何解决?
Posted
技术标签:
【中文标题】为啥 sed 会因国际字符而失败以及如何解决?【英文标题】:Why does sed fail with International characters and how to fix?为什么 sed 会因国际字符而失败以及如何解决? 【发布时间】:2010-09-09 04:56:39 【问题描述】: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
我希望只看到X
和Y
,因为我已要求删除直到'|'
的所有字符以及超出它的空间。相反,我得到:
X<br>
Gras Och Stenar Trad - From M? Y
我知道我可以使用 tr 删除国际字符。首先,但有没有办法只使用 sed?
【问题讨论】:
这个问题似乎已经用 GNU sed 解决了(在 4.2.2 版本上测试)。 【参考方案1】:sed
不适用于非 ASCII 文本。但是,您可以在perl
中使用(几乎)相同的代码并获得您想要的结果:
perl -pe 's/.*\| //' x
【讨论】:
【参考方案2】:我认为如果文件的输入编码与您环境的首选编码不同,则会发生错误。
示例: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 会因国际字符而失败以及如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?
为啥 TextOutW() 会因自定义字体大于 131 像素而失败?
为啥使用通配符将参数数量减半会因“参数列表太长”而失败? [复制]
为啥 spark-xml 会因 NoSuchMethodError 与 Spark 2.0.0 依赖关系而失败?
SimpleXMLConverter 和改造 2.30。为啥序列化会因 ValueRequiredException 而崩溃?