15

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

我希望只看到Xand Y,因为我已要求将所有字符删除到'|'and 之外的空间。相反,我得到:

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

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

4

2 回答 2

26

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

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

于 2008-09-15T22:18:29.733 回答
11

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

perl -pe 's/.*\| //' x
于 2008-09-15T22:02:40.567 回答