Cha*_*les 8 grep text-processing binary
我有一个很大的 utf-8 文本文件,我经常用grep
. 最近grep
开始报告它是一个二进制文件。我可以继续用 搜索它grep -a
,但我想知道是什么改变使它决定文件现在是二进制的。
我有一份上个月的副本,该文件不再被检测为二进制文件,但这对diff
他们来说不切实际,因为它们在 > 20,000 行上有所不同。
file
将我的文件标识为
UTF-8 Unicode 英文文本,行很长
我怎样才能找到字符/行/等。在我的文件中触发了这个变化?
类似的非重复问题19907涵盖了 NUL 的可能性,但grep -Pc '[\x00-\x1F]'
表示我没有 NUL 或任何其他 ANSI 控制字符。
似乎是文件中存在空字符。(通常显示 ^@)我在文本文件中输入了各种控制字符(例如删除,^?,例如),只有空字符导致 grep 考虑它一个二进制文件。这仅针对 grep 进行了测试。例如,less 和 diff 命令可能有不同的方法。控制字符通常不会出现,除非在二进制文件中。空白字符除外:换行符 (^M)、制表符 (^I)、换页符 (^L)、垂直制表符 (^K) 和回车符 (^J)。
然而,外来字符,如阿拉伯语或中文字母,不是标准的 ASCII,并且可能会与控制字符混淆。也许这就是为什么它只是空字符的原因。
您可以使用文本编辑器 vim 将控制字符插入文本文件来亲自测试一下。只需进入插入模式,按 control-v,然后按控制字符即可。