【问题标题】: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

我希望只看到XY,因为我已要求删除直到'|' 的所有字符以及超出它的空间。相反,我得到:

X<br>
Gras Och Stenar Trad - From M? Y

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

【问题讨论】:

  • 这个问题似乎已经用 GNU sed 解决了(在 4.2.2 版本上测试)。

标签: linux internationalization sed character


【解决方案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。

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      相关资源
      最近更新 更多