为什么 grep 命令对 UTF-16 LE 编码的文本文件不起作用?

Why doesn't grep command work on text files with UTF-16 LE encoding?

我想将一个文本文件中以特定字符串开头的所有行保存到另一个文本文件中。所以,我使用这个 grep 命令来做到这一点:

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

但是输出文件 output.txt 是空的,尽管文件 input.txt 中有很多行以单词 'this' 开头。我的一位导师建议文件 input.txtUTF-16 LE 格式,并要求我将其更改为 UTF-8。然后命令运行良好。

为什么 grep 命令对 UTF-16 LE 格式的文件不起作用?

grep 不支持编码。它不搜索 "characters",而是搜索 bytes。您的控制台正在向 grep 发送 UTF-8/ASCII 编码文本(在本例中与字符串“^This”相同)以供搜索。如果文件包含 UTF-16 编码文本,则不会匹配,因为字节表示不同。

Deceze 的回答是正确的。但是有一个转折点:grep 确实可以识别您的语言环境设置,例如当您的环境区域设置为带有 export LANG=en_US.UTF-8 的 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)。但是,这些工具并不是 grep 的真正替代品,因为它们的行为和命令行选项与 grep 不同。