为什么grep命令不能在UTF-16 LE编码的文本文件上工作?

3

我想把一个文本文件中所有以特定字符串开头的行保存到另一个文本文件中。因此,我使用了这个grep命令来完成:

Original Answer翻译成:"最初的回答"

grep '^This' input.txt > output.txt

但是输出文件output.txt是空的,尽管在文件input.txt中有很多以单词“this”开头的行。我的一位导师建议我将文件input.txt转换成UTF-8格式,因为它可能是UTF-16 LE格式。然后命令就可以正常工作了。
为什么grep命令不能处理UTF-16 LE格式的文件?

检查BOM。 - Wiktor Stribiżew
BOM?你是指带有BOM的UTF-8吗?使用那个也能正常工作。 - Light Yagami
1
你说你有UTF 16 LE。试试 iconv -f UTF-16LE -t UTF-8 myfile.txt | grep ....... - Wiktor Stribiżew
你的命令是将文本文件从UTF-16 LE编码转换为UTF-8吗?谢谢。但我想知道为什么它不能处理UTF-16 LE编码的文件? - Light Yagami
2个回答

6

grep 不支持编码处理。它不搜索“字符”,而是搜索 字节。你的控制台向 grep 发送 UTF-8/ASCII 编码的文本(在此示例中,字符串“^This”也是如此)进行搜索。如果文件包含 UTF-16 编码的文本,则不会匹配,因为字节表示不同。


1
要在许多文件中进行grep操作而无需转换它们,ripgrep(rg)是最佳选择 https://github.com/BurntSushi/ripgrep - Cyril Chaboisseau

3
Deceze的回答是正确的。但是有一个问题:grep确实识别您的语言环境设置,例如当您的环境语言环境设置为UTF-8时,使用export LANG=en_US.UTF-8会匹配UTF-8模式。然而,grep不支持UTF-16。您需要先将UTF-16转换为UTF-8,如下所示:
iconv -f UTF-16 -t UTF-8 < input.txt | grep '^This' > output.txt

如果您经常遇到这个问题,我建议使用一个完全支持UTF编码的grep替代工具。例如,ugrep支持常见的GNU/BSD grep命令行选项。其他选择包括ripgrep、ack、silver searcher(ag)。然而,这些工具并不是真正的drop-in替代品,因为它们的行为和命令行选项与grep不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接