我正在尝试使用它grep
从 ISO-8859-1 编码文件中搜索文本模式:单词列表
当我执行搜索时,所有匹配项都会返回,但重音字符会被删除。例如,如果我想搜索所有以 结尾的单词-ese
:
$ LC_ALL=pt_PT.ISO-8859-1 grep -a ese\$ wordsList
结果有 58 个匹配项。其中一个匹配项是单词hipótese
,但打印出来时显示为hiptese
(缺少ó
字符)。如何防止grep
输出删除重音字符?
答案1
如何防止
grep
输出去掉重音字符?
grep
它本身不会去除重音字符,它会输出输入文件中匹配的行。是你的终端(终端模拟器)没有将编码为 ISO-8859-1 的重音字符解释为它应该解释的任何内容展示作为重音字符。
您的终端很可能需要 UTF-8。本答案的其余部分假设终端确实需要 UTF-8 并且语言环境为something.UTF-8
(例如pt_PT.UTF-8
)。默认情况下,许多现代类 Unix 系统都应该如此,当然在 Linux 中也是如此。
可能的解决方案:
您可能能够将终端仿真器配置为 ISO-8859-1,运行命令并重新配置回 UTF-8。(例如,从
konsole
菜单中选择:View
,Set Encoding
;等等)。但我不会这样称呼它。grep
或者动态地将输出转换为 UTF-8:LC_ALL=pt_PT.ISO-8859-1 grep -a ese\$ wordsList | iconv -f ISO-8859-1 -t UTF-8
如果您计划大量使用该文件,请将内容转换为 UTF-8*:
<wordsList iconv -f ISO-8859-1 -t UTF-8 >wordsList-utf8
然后直接使用新文件即可,例如:
grep ese\$ wordsList-utf8
现在您甚至可以用一种直接的方式 grep 重音字符,例如:
grep ó wordsList-utf8
一般来说Unicode 等效性可能会有问题;但在这里,由于文件是从 ISO-8859-1 转换而来的,我期望一致性:每一个
ó
都应U+00F3(0xC3B3
在 UTF-8 中,上面grep
会找到它),不是U+006F其次是U+0301(0x6FCC81
在 UTF-8 中,上述代码grep
将找不到它);其他重音字符也是如此。
* 我注意到您使用了grep -a
,就好像您需要grep
将二进制文件视为文本一样。如果您的wordsList
文件确实是非文本,则将其全部转换为 UTF-8 可能会失败或给您带来混乱的非文本部分。由于您没有链接到单个特定文件,因此我无法进一步调查,只能猜测。我猜您指的是“仅文件”下链接的文件,即可以从中提取的文件单词列表.zip-a
。对于这个特定的文件,我不需要grep
,只要我告诉grep
使用正确的编码(这就是所做LC_ALL=pt_PT.ISO-8859-1
的)。