linux - 为什么 sed 会因国际字符而失败以及如何修复?

标签 linux internationalization sed character

GNU sed 版本 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?

最佳答案

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

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

关于linux - 为什么 sed 会因国际字符而失败以及如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67410/

相关文章:

c - 简单的 linux 应用程序读错了 tty?

posix 和 linux 特定功能的 C++ 包装器

css - 如何测试CSS方向: auto as an english speaker

linux - 在 linux 下搜索和替换?

linux - 替换偶数或奇数字符串匹配

linux - 如何在shell中动态添加和使用变量

linux - 无法在 Ubuntu 16.04 中启动 Docker 服务

asp.net-mvc-3 - 在 TFS 测试运行期间加载本地化的 resx 文件

java - 特殊字符和重音字符

unix - 通过 Sed 在文件的一行中搜索两位数