grepがファイルをバイナリとして扱うのはなぜですか?

grepがファイルをバイナリとして扱うのはなぜですか?

私のボックスには、Windowsシステムのいくつかのデータベースダンプがあります。テキストファイルです。私はそれらをgrepするためにcygwinを使用しています。このファイルはプレーンテキストファイルのようです。メモ帳やワードパッドなどのテキストエディタで開きましたが、きれいに見えました。しかし、grepを実行するとbinary file foo.txt matches

NUL私はこれらのファイルにデータベースダンプの成果物であると仮定するいくつかのASCII文字が含まれていることを発見しました。

それでは、grepがこれらのファイルがバイナリだと思うのはなぜですか?数値NUL?ファイルシステムにフラグがありますか? grepで行の一致を表示するには何を変更する必要がありますか?

答え1

NULファイルに文字が含まれている場合、grepはそれをバイナリファイルとして扱います。

このような回避策があるかもしれませんcat file | tr -d '\000' | yourgrep。まず、すべてのNULL値を削除してからファイルを検索してください。

答え2

grep -a私のために働く:

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

答え3

このstringsユーティリティを使用すると、すべてのファイルからテキストコンテンツを抽出し、grep次のようにパイプできますstrings file | grep pattern

答え4

私のテキストファイルの1つは突然grepによってバイナリファイルとして扱われます。

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

解決策は、次のように変換することですiconv

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

関連情報