Grep 在 ISO-8859-1 编码文件中搜索文本

Grep 在 ISO-8859-1 编码文件中搜索文本

我正在尝试使用它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菜单中选择:ViewSet 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+00F30xC3B3在 UTF-8 中,上面grep会找到它),不是U+006F其次是U+03010x6FCC81在 UTF-8 中,上述代码grep将找不到它);其他重音字符也是如此。


* 我注意到您使用了grep -a,就好像您需要grep将二进制文件视为文本一样。如果您的wordsList文件确实是非文本,则将其全部转换为 UTF-8 可能会失败或给您带来混乱的非文本部分。由于您没有链接到单个特定文件,因此我无法进一步调查,只能猜测。我猜您指的是“仅文件”下链接的文件,即可以从中提取的文件单词列表.zip-a。对于这个特定的文件,我不需要grep,只要我告诉grep使用正确的编码(这就是所做LC_ALL=pt_PT.ISO-8859-1的)。

相关内容