Jef*_*uer 5 linux grep character-encoding
我正在尝试grep从 ISO-8859-1 编码文件中搜索文本模式:wordsList
当我执行搜索时,将返回所有匹配项,但重音字符将被删除。例如,如果我想搜索所有以 结尾的单词-ese:
$ LC_ALL=pt_PT.ISO-8859-1 grep -a ese\\$ wordsList\nRun Code Online (Sandbox Code Playgroud)\n结果是 58 场比赛。其中一个匹配项是单词hip\xc3\xb3tese,但打印出来时显示为hiptese(缺少\xc3\xb3字符)。如何防止grep输出去除重音字符?
\n\n如何防止
\ngrep输出去除重音字符?
grep它本身不会去除重音字符,它会输出输入文件中的匹配行。您的终端(终端模拟器)不会将编码为 ISO-8859-1 的重音字符解释为应显示为重音字符的任何字符。
您的终端很可能需要 UTF-8。这个答案的其余部分假设终端确实需要 UTF-8 并且区域设置是something.UTF-8(例如pt_PT.UTF-8)。默认情况下,在许多现代类 Unix 系统中应该如此,当然在 Linux 中也是如此。
可能的解决方案:
\n您可以将终端模拟器配置为 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\nRun Code Online (Sandbox Code Playgroud)\n如果您打算经常使用该文件,请将内容转换为 UTF-8*:
\n<wordsList iconv -f ISO-8859-1 -t UTF-8 >wordsList-utf8\nRun Code Online (Sandbox Code Playgroud)\n然后无需技巧即可使用新文件,例如:
\ngrep ese\\$ wordsList-utf8\nRun Code Online (Sandbox Code Playgroud)\n现在您甚至可以以简单的方式 grep 查找重音字符,例如:
\ngrep \xc3\xb3 wordsList-utf8\nRun Code Online (Sandbox Code Playgroud)\n一般来说,Unicode 等效性可能是一个问题;但在这里,由于该文件是从 ISO-8859-1 转换而来的,所以我期望一致性:每个\xc3\xb3都应为U+00F3(0xC3B3在 UTF-8 中,上面grep会找到它),而不是U+006F后跟U+0301(0x6FCC81在UTF-8,上面grep找不到);对于其他重音字符也类似。
* 我注意到您使用了grep -a,就好像您需要grep像文本一样对待二进制文件。如果您wordsList确实是非文本,则将其全部转换为 UTF-8 可能会失败或给您带来损坏的非文本部分。由于您没有链接到单个特定文件,因此我无法在不猜测的情况下进一步调查。我猜您的意思是“仅文件”下链接的文件,即可以从WordsList.zip中提取的文件。对于这个特定的文件,我不需要-afor grep,只要我告诉grep使用正确的编码(这就是所做LC_ALL=pt_PT.ISO-8859-1的)。