【问题标题】:Grep thinks text file is binary, but it isn'tGrep 认为文本文件是二进制文件,但事实并非如此
【发布时间】:2016-05-21 23:32:41
【问题描述】:

我在我们的代码库中发现了一个.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=

【问题讨论】:

  • 也许尝试通过iconv 运行它,看看它是否有任何Unicode字符。
  • 这听起来像文件包含的字节序列对于您当前的语言环境是不合法的。您能否编辑您的问题以包含locale 命令的输出?
  • @MarkSetchell iconv 给出了问题的位置。谢谢。正在调查这个...

标签: windows text grep binaryfiles git-bash


【解决方案1】:

由于您使用的是 MS Windows,test.cpp 文件可能使用 UTF-16(常见于最新版本的 Windows)或 Windows-1252 (CP-1252) 作为其字符编码(可能是其中一个 cmets 中的印刷报价)。

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

LC_ALL=C grep pattern test.cpp

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

【讨论】:

  • 你是对的,在某个地方的字符串中有一个印刷引号,可能是由使用 ANSI/windows-1252 编码的工具插入的。谢谢!
  • 我的 grep 命令可能没有找到它,因为引号是 utf-8 中的延续字符(这是我的语言环境设置)。我应该在字节级别进行测试,绕过 utf-8 编码。
猜你喜欢
  • 2020-07-10
  • 1970-01-01
  • 2010-10-28
  • 2011-10-14
  • 1970-01-01
  • 2012-08-04
  • 2012-05-31
  • 2011-01-22
相关资源
最近更新 更多