是什么让 grep 将文件视为二进制文件?

是什么让 grep 将文件视为二进制文件?

我的盒子上有一些来自 Windows 系统的数据库转储。它们是文本文件。我正在使用 cygwin 来 grep 它们。这些看起来是纯文本文件;我用记事本和写字板等文本编辑器打开它们,它们看起来很清晰。但是,当我对它们运行 grep 时,它会说binary file foo.txt matches.

我注意到这些文件包含一些 asciiNUL字符,我认为这些字符是数据库转储中的工件。

那么是什么让 grep 认为这些文件是二进制的呢?人物NUL?文件系统上有标志吗?我需要更改什么才能让 grep 向我显示行匹配项?

答案1

NUL如果文件中的任何位置有字符,grep 都会将其视为二进制文件。

可能有这样的解决方法cat file | tr -d '\000' | yourgrep,首先消除所有空值,然后搜索文件。

答案2

grep -a为我工作:

$ grep --help
[...]
 -a, --text                equivalent to --binary-files=text

答案3

您可以使用该strings实用程序从任何文件中提取文本内容,然后通过管道将其传输grep,如下所示:strings file | grep pattern

答案4

我的一个文本文件突然被 grep 视为二进制文件:

$ file foo.txt
foo.txt: ISO-8859 text

解决方案是使用以下方法对其进行转换iconv

iconv -t UTF-8 -f ISO-8859-1 foo.txt > foo_new.txt

相关内容