use*_*579 3 shell sed character-encoding
如果我编写一些操作文件的脚本,比如使用sed进行一些搜索/替换,并且文件可以在各种字符集中,那么这些文件是否会被破坏?
我想要替换的文本是ASCII,也只出现在只包含ASCII文件的行中,但其余行包含其他字符集中的字符.
如果您的字符集是单字节编码(如ISO-8859-n系列)或UTF-8,其中换行符与ASCII中相同,并且NUL字符(\0)不会发生,则您的操作可能是工作.如果文件使用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
Run Code Online (Sandbox Code Playgroud)
但是,如果您只想替换文字字符串,它会按预期工作:
$ 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
Run Code Online (Sandbox Code Playgroud)
如您所见,结果不同,因为根据区域设置,重音字符的处理方式不同.简而言之:文字ASCII字符串的替换最有可能正常工作,更复杂的操作需要调查,可能工作与否.