テキストファイルがバイナリとしてマークされる問題が発生しています

テキストファイルがバイナリとしてマークされる問題が発生しています

出力としてテキスト ファイルを生成する実行ファイルがあります。問題は、テキスト ファイルが何らかのバイナリ ファイル フラグ付きで出力されることです。結果は次のようになります。

$ grep "grep string" output_file.txt
Binary file output_file.txt matches.

$ grep -a "grep string" output_file.txt
[correct results]

ある資料によると、grep は最初の 1,000 バイト程度でヌル文字を探し、そこからファイルが「バイナリ」かどうかを判断するとのことですが、私の質問は次の 2 つです。

  1. -a フラグなしで grep が正しく動作するように、ファイルから null 文字を削除する簡単な方法はありますか (後処理の一部としてこれを実行できます)?

  2. ファイルに null 文字が書き込まれないようにするために、コード内で確認すべき明らかな点はありますか? コードを徹底的に調べましたが、明らかな原因は見つかりませんでした。

答え1

少なくとも最初の質問には答えられます。Unix/Linuxを使用している場合はtrを使用できます。

tr -d '\000' < filein > fileout

ここで、\000 は null 文字です。次の例に示すように、印刷できない文字をすべて削除することもできます。「Unix テキスト編集: sed、tr、cut、od、awk」

2 番目の質問に関して、どのプログラミング言語を使用しているかはわかりませんが、出力ファイルに印刷されてしまう可能性のある初期化されていない変数を検索します。

答え2

推測してみます…。

プログラムは、各文字に 2 バイトを使用する Unicode のエンコードである UTF-16 でファイルを書き込みます。ほとんどの場合、2 バイトごとに null になります。

iconv -f utf-16 -t utf-8 < filein > fileout

ほとんどの coreutils が対応している UTF-8 に変換します。

答え3

もう一つの選択肢は文字列このツールは、エンコーディングやヌル文字を「修正」するだけでなく、実際のバイナリからテキストデータを取得できるため、

$ strings output_file.txt | grep "grep 文字列"

バイナリファイル内の何かを素早く見つけるのに非常に便利です。例:

$ 文字列firmware.bin | grep VERSION

関連情報