Grep 认为文本文件是二进制的,但它不是

Grep thinks text file is binary, but it isn't

我在我们的代码库中发现了一个 .cpp 文件,grep 将其视为二进制文件。所以我不能像文本文件一样对它进行 grep,这很烦人,而且显然不是应该的样子。所以我想知道为什么 grep 认为该文件是二进制文件并解决这个问题。

我尝试使用命令

找出任何不寻常的字符
grep -Pna --color -r "[\x00-\x08]|[\x10-\x19]|[\x80-\xFF]" test.cpp

但它没有产生任何匹配项。

如何找出这个问题的原因?

我应该提到我在 windows git bash.

语言环境的输出:

LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=

由于您使用的是 MS Windows,因此 test.cpp 文件可能使用 UTF-16(在 Windows 的最新版本中很常见)或 Windows-1252 (CP-1252) 作为其字符编码(可能是其中一条评论中的印刷引用)。

当您的语言环境设置为 UTF-8 并且 grep 检测到该语言环境的无效字符时,它假定该文件是二进制文件。一个快速解决这个问题的方法是在 运行 grep 命令时通过临时修改 LC_ALL 环境变量来让 grep 使用 C 语言环境:

LC_ALL=C grep pattern test.cpp

更好的长期解决方案是将文本文件(使用 iconv 或您最喜欢的文本编辑器)转换为使用 UTF-8 作为其字符编码。