如何在ISO-8859-1编码文件中使用grep搜索并保留带重音字符?
我之前也碰到过类似的问题,大概率是终端编码与文件编码不匹配或者grep的locale设置导致了字符显示异常。咱们一步步来解决:
首先理清问题根源:你用LC_ALL=pt_PT.ISO-8859-1指定了grep的locale,但如果你的终端默认是UTF-8编码,ISO-8859-1格式的重音字符(比如ó对应的字节0xF3)在UTF-8终端里会被识别为无效字符,进而出现显示丢失或乱码的情况。
下面是几个可行的解决方案:
方案1:切换终端编码为ISO-8859-1
直接把终端的字符编码改成Western (ISO-8859-1)(不同终端的设置路径不一样:Linux终端一般在“首选项”→“编码”里选择;macOS终端则是“终端”→“设置”→“高级”→“字符编码”)。改完之后再运行你的命令:
LC_ALL=pt_PT.ISO-8859-1 grep -a ese\$ wordsList
这样终端就能正确解析ISO-8859-1的重音字符,不会再丢失ó这类符号了。
方案2:将文件转码为UTF-8后搜索
如果不想改终端编码,更通用的办法是先把ISO-8859-1的文件转换成UTF-8格式,再用grep搜索——毕竟现在大部分终端默认都支持UTF-8,这样处理后结果能直接正常显示:
iconv -f ISO-8859-1 -t UTF-8 wordsList | grep ese\$
iconv是专门做编码转换的工具,这条命令会把原文件转成UTF-8后通过管道传给grep,搜索结果里的重音字符就能正确显示。
方案3:让grep按原始字节处理
用LC_ALL=C强制grep以字节为单位处理文件,不做任何字符编码相关的转换,这样输出的就是原文件的原始字节序列。只要你的终端能识别这些字节(或者临时切换编码),就能看到正确的重音:
LC_ALL=C grep -a ese\$ wordsList
注意:这个方案下正则表达式是按字节匹配的,但你的需求是匹配结尾的ese,不会受重音字符影响,完全适用。
优先试试方案2吧,不用改终端设置,省心又通用~
备注:内容来源于stack exchange,提问作者Jeffrey Bauer

