ヌル文字とheadコマンド

headコマンドとtailコマンドで表示の異なるファイルがあった。1行が575バイトのはずなのだが、1行の文字数を数えてみると、tailコマンドでは正しい結果が得られるのに、headコマンドだと正しくない。不規則に改行が入っているようだ。

$ head -1 ${FILE} |wc -c
56
$ tail -1 ${FILE} |wc -c
575

さらに調べるため、headコマンドで改行されている文字の前後を16進数にして調べてみた。

od -x ${FILE}

するとどうやら、ヌル文字を改行コードとして扱っていることが判明した。ファイルを作成するC++のプログラムの構造体をヌル文字で初期化しているらしい。C++のソースを直し手ている暇はなかったので、別の文字(今回はバーチカルライン"|")で置換して対応して切り抜けた。

tr -s "\0" "|" < ${SOURCE_FILE} > ${TARGET_FILE}

面白いことに、正しく表示されるtailコマンドでファイルでリダイレクトしてファイルに吐いても、ヌル文字は残っているようだ。この辺のこと、もっとわかるようになりたい。