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 作为其字符编码。
我在我们的代码库中发现了一个 .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 作为其字符编码。