grep如何确定文件是二进制文件?


8

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

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

file 将我的文件标识为

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

如何找到字符/行/等。在我的文件中哪些触发了此更改?


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


我将按以下顺序尝试该操作:1.使用strace / ltrace运行它,以检查导致该“二进制”消息的输入2.检查grep的源并读取它
ott--

@muru:我正在使用gnu grep,但是如果您对其他版本有答案,我也会很感兴趣。
查尔斯(Charles)

奇。我有一个文件,其中包含nulEsc。我为他们尝试了grepping。我可以找到escs(\x1B),但nul从未出现。上面给出的测试显示,对于包含Escs 的行,显示1,但是对于不包含的任何范围,则没有显示\x1B。我不相信那个测试。试一试grep -zc .(应该比nul文件中的s大1)。(另外,使用可能会更好[[:cntrl:]]。)
muru

另请尝试:sed -z 's/.*\(....\)$/\1/' foo | od -cNUL(如果有)之前看到几个字符,这可能会导致您遇到问题。
muru

@muru:我sed没有-z选择:sed: invalid option -- 'z'
查尔斯(Charles)

Answers:


2

文件中似乎存在空字符。(通常显示为^ @)我在文本文件中输入了各种控制字符(例如delete,^?等),只有空字符使grep认为它二进制文件。仅针对grep进行了测试。例如,less和diff命令可能具有不同的方法。除二进制以外,控制字符通常不会出现。空格字符除外:换行符(^ M),制表符(^ I),换页(^ L),垂直制表符(^ K)和return(^ J)。

但是,外来字符(例如阿拉伯或中文字母)不是标准的ascii,并且可能会与控制字符混淆。也许这就是为什么它只是空字符。

您可以通过使用文本编辑器vim将控制字符插入文本文件中来自己进行测试。只需进入插入模式,按Ctrl-v,然后按控制字符。


2

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.