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

Jef*_*uer 5 linux grep character-encoding

我正在尝试grep从 ISO-8859-1 编码文件中搜索文本模式:wordsList

\n

当我执行搜索时,将返回所有匹配项,但重音字符将被删除。例如,如果我想搜索所有以 结尾的单词-ese

\n
$ LC_ALL=pt_PT.ISO-8859-1  grep -a ese\\$  wordsList\n
Run Code Online (Sandbox Code Playgroud)\n

结果是 58 场比赛。其中一个匹配项是单词hip\xc3\xb3tese,但打印出来时显示为hiptese(缺少\xc3\xb3字符)。如何防止grep输出去除重音字符?

\n

Kam*_*ski 9

\n

如何防止grep输出去除重音字符?

\n
\n

grep它本身不会去除重音字符,它会输出输入文件中的匹配行。您的终端(终端模拟器)不会将编码为 ISO-8859-1 的重音字符解释为应显示为重音字符的任何字符。

\n

您的终端很可能需要 UTF-8。这个答案的其余部分假设终端确实需要 UTF-8 并且区域设置是something.UTF-8(例如pt_PT.UTF-8)。默认情况下,在许多现代类 Unix 系统中应该如此,当然在 Linux 中也是如此。

\n

可能的解决方案:

\n
    \n
  • 您可以将终端模拟器配置为 ISO-8859-1,运行命令并重新配置回 UTF-8。(例如,konsole从菜单中选择:ViewSet Encoding;等等)。但我不会用正确的方式称呼它。

    \n
  • \n
  • grep或者即时将 的输出转换为 UTF-8:

    \n
    LC_ALL=pt_PT.ISO-8859-1 grep -a ese\\$ wordsList | iconv -f ISO-8859-1 -t UTF-8\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 如果您打算经常使用该文件,请将内容转换为 UTF-8*:

    \n
    <wordsList iconv -f ISO-8859-1 -t UTF-8 >wordsList-utf8\n
    Run Code Online (Sandbox Code Playgroud)\n

    然后无需技巧即可使用新文件,例如:

    \n
    grep ese\\$ wordsList-utf8\n
    Run Code Online (Sandbox Code Playgroud)\n

    现在您甚至可以以简单的方式 grep 查找重音字符,例如:

    \n
    grep \xc3\xb3 wordsList-utf8\n
    Run Code Online (Sandbox Code Playgroud)\n

    一般来说,Unicode 等效性可能是一个问题;但在这里,由于该文件是从 ISO-8859-1 转换而来的,所以我期望一致性:每个\xc3\xb3都应为U+00F30xC3B3在 UTF-8 中,上面grep会找到它),而不是U+006F后跟U+03010x6FCC81在UTF-8,上面grep找不到);对于其他重音字符也类似。

    \n
  • \n
\n
\n

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

\n