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

时间:2016-02-11 09:18:25

标签: windows text grep binaryfiles git-bash

我在代码库中遇到了.cpp文件,被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=

1 个答案:

答案 0 :(得分:2)

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

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

LC_ALL=C grep pattern test.cpp

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