我的盒子上有一些来自 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