如果我编写一些脚本来操作文件,比如使用sed进行搜索/替换,而这些文件可能存在于各种字符集中,那么这些文件会被损坏吗?
我希望替换的文本是ASCII码,并且仅出现在只包含ASCII字符的文件行中,但文件的其余行包含其他字符集中的字符。
我希望替换的文本是ASCII码,并且仅出现在只包含ASCII字符的文件行中,但文件的其余行包含其他字符集中的字符。
\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
但是如果您只想替换文字字符串,它会按预期工作:
$ 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字符串的替换很可能可以正常工作,更复杂的操作需要仔细研究,可能会起作用,也可能不会。
ę
,则替换将正确插入表示 ę
的 2 个字节,但这些字节将与文件的其余部分一起在 Latin-2 中显示为垃圾。 - Michał Kosmulski