grep 如何判断文件是二进制文件?

grep 如何判断文件是二进制文件?

我有一个很大的 utf-8 文本文件,我经常使用grep.最近grep开始报告说这是一个二进制文件。我可以继续使用 进行搜索grep -a,但我想知道是什么变化使它决定该文件现在是二进制的。

我有一份上个月的副本,其中该文件不再被检测为二进制文件,但这对他们来说不实用,diff因为它们的差异超过 20,000 行。

file将我的文件标识为

UTF-8 Unicode 英文文本,行很长

我怎样才能找到字符/台词/等等。在我的文件中哪些触发了此更改?


类似的、非重复的问题19907涵盖了 NUL 的可能性,但grep -Pc '[\x00-\x1F]'说我没有 NUL 或任何其他 ANSI 控制字符。

答案1

似乎是文件中存在空字符。(通常显示 ^@)我在文本文件中输入了各种控制字符(例如删除,^?,例如),只有空字符导致 grep 考虑它一个二进制文件。这仅针对 grep 进行了测试。例如,less 和 diff 命令可能有不同的方法。控制字符通常不会出现,除非在二进制文件中。空白字符除外:换行符 (^M)、制表符 (^I)、换页符 (^L)、垂直制表符 (^K) 和回车符 (^J)。

然而,外来字符,如阿拉伯语或中文字母,不是标准的 ASCII,并且可能会与控制字符混淆。也许这就是为什么它只是空字符的原因。

您可以使用文本编辑器 vim 将控制字符插入文本文件来亲自测试一下。只需进入插入模式,按 control-v,然后按控制字符即可。

答案2

典型的现代 grep 实现应该仅在内部有 nul 字节的情况下声明文件为“二进制”。其他的应该没问题。

我不能代表您使用的 grep 实现......

答案3

根据 mbrlen() 的编码错误也使得 GNU grep 2.24 将其视为二进制

例如:

export LC_CTYPE='en_US.UTF-8'
printf 'a\x80' | grep 'a'

因为\x80不能是 UTF-8 Unicode 点的第一个字节:https://en.wikipedia.org/wiki/UTF-8#Description

这是除此之外唯一的可能NUL

GNUgrep源代码解释得出这个结论:是什么让 grep 将文件视为二进制文件?

相关内容