sed(和其他人)会破坏非ASCII文件吗?

时间:2012-03-12 16:26:03

标签: shell character-encoding sed

如果我编写一些操作文件的脚本,比如使用sed进行一些搜索/替换,并且文件可以在各种字符集中,文件是否会被破坏?

我想要替换的文本是ASCII,也只出现在只包含ASCII的文件中的行,但其余的行包含其他字符集中的字符。

1 个答案:

答案 0 :(得分:5)

如果您的字符集是单字节编码(如ISO-8859-n系列)或UTF-8,其中换行符与ASCII中的相同,并且NUL字符(\0)不是&# 39; t发生,你的手术可能会奏效。如果文件使用UTF-16,则不会(因为NUL)。为什么它应该用于简单搜索和替换ASCII字符串是:我们假设,您的编码是ASCII的超集,对于像这样的简单匹配,sed将主要在字节级上工作,只需替换一个字节序列与另一个人。

但是:对于更复杂的操作,例如当您的替换字符串或替换字符串包含特殊字符时,您的结果可能会有所不同。例如,如果控制台编码/区域设置与文件编码不同,则在命令行中输入的重音字符可能不适合文件中的编码。人们可以解决这个问题,但需要小心。

sed中的某些操作取决于您的区域设置,例如哪些字符被视为字母数字。比较例如在波兰语UTF-8语言环境和使用ASCII的C语言环境中执行的以下替换:

$ echo "gęś gęgała" | LC_ALL=pl_PL.UTF-8 sed -e 's/[[:alnum:]]/X/g'
XXX XXXXXX
$ echo "gęś gęgała" | LC_ALL=C sed -e 's/[[:alnum:]]/X/g'
Xęś XęXXłX

但是如果你只想替换文字字符串,它会按预期工作:

$ echo "gęś gęgała" | LC_ALL=pl_PL.UTF-8 sed -e 's/g/G/g'
Gęś GęGała
$ echo "gęś gęgała" | LC_ALL=C sed -e 's/g/G/g'
Gęś GęGała

如您所见,结果不同,因为根据区域设置,重音字符的处理方式不同。简而言之:文字ASCII字符串的替换最有可能正常工作,更复杂的操作需要调查,可能有效或无效。