UNIXでのnull文字の識別と削除


98

不要なnull文字(ASCII NULなど\0)を含むテキストファイルがあります。私はそれを表示しようとするとvi、私が見る^@通常のテキストでインタリーブシンボルを、。どうやって:

  1. ファイルのどの行にnull文字が含まれているかを特定しますか?私はのためにgrepを試みている\0\x0、これは動作しませんでした。

  2. ヌル文字を削除しますか?stringsファイルで実行するとクリーンアップされますが、これが最善の方法かどうか疑問に思っていますか?


1
この種の質問は、おそらくSuperUser.comに属します
Olivier Lalonde

2
実際、この質問はsuperuser.comにあります:superuser.com/questions/75130/how-to-remove-ths-symbol-with-vim
jrb '​​26

回答:


130

私は使用しますtr

tr < file-with-nulls -d '\000' > file-without-nulls

コマンド引数の途中の入力リダイレクトが機能するかどうか疑問に思っている場合は、機能します。ほとんどのシェルは認識してI / Oリダイレクション(との契約だろう<>実際には、コマンドラインで、...)どこでも。


また、「diff file-with-nulls file-without-nulls」では、どの行にnull文字が含まれているかが表示されますか?それは予想以上に多くを取り戻します。
dogbane 2010年

10
実際、はシェルパイプ機能の一部であり、ではないのでtr -d '\000' < file-with-nulls > file-without-nulls、それは正しいはずです。<tr
ミカエルS

9
ほとんどのシェルは、実際には引数文字列のどこでも<または>を認識して処理します。私も驚いた。
pra

1
+1入力リダイレクトをの代わりに使用しますcat |。細かい、きれいなソリューションとそれは私の問題を解決しました。
KrzysztofJabłoński

4
@Pointy '\ 000'は、trのPOSIXオープングループ仕様の '\ 0'の代わりに使用されます。それはそれを好む正当な理由です
ハロルド・フィッシャー

67

ファイル内のnull文字を削除するには、次のsedコマンドを使用します。

sed -i 's/\x0//g' null.txt

このソリューションは、ファイルを適切に編集します。ファイルがまだ使用されている場合は重要です。-i'ext 'を渡すと、「ext」サフィックスが追加された元のファイルのバックアップが作成されます。


6
注:FreeBSD(および私はMac OS Xも信じています)では、次の引数に拡張がsed -i 必要ですが、空の場合があります。これらのシステムでは''、次のようにを追加しますsed -i '' 's/\x0//g "$FILE"
TimČas2017

1
これはtr私よりも桁違いに速い
ディアケデリック'30年

私にとっては、Windows用のGitを使用して$ sed --version- > sed (GNU sed) 4.7、私はと呼ばれるバックアップファイルを取得するには、以下の呼び出しを使用していたexample.csv.baksed -i.bak 's/\x0//g' example.csv
アンドリュー・キートン

1
@TimČあなたは素晴らしいことをしたので、1つ欠けたので 'sed -i' '' s / \ x0 // g 'some_file.xml
Darko

@ダーコだから私はやった。おっとっと。
TimČ、

22

多数の不要なNUL文字(1バイトおきなど)は、ファイルがUTF-16でエンコードされiconvており、UTF-8への変換に使用する必要があることを示しています。


1
アプリケーションのロギング中にディスク容量が足りなくなりました。これにより、これらの文字が発生します。
dogbane 2010年

たとえば、次のコマンドを使用して機能しますiconv -f UTF-16 -t UTF-8 file
djule5

7

私は次のことを発見しました。これは、null文字がある行があれば、それを出力します。

perl -ne '/\000/ and print;' file-with-nulls

また、8進ダンプでは、nullがあるかどうかがわかります。

od file-with-nulls | grep ' 000'

5

ファイルの行が\ r \ n \ 000で終わっている場合は、\ n \ 000を削除してから、\ rを\ nに置き換えます。

tr -d '\n\000' <infile | tr '\r' '\n' >outfile

PS。Windows DOSシェルを使用している場合は、GNU / win32バージョンのUnixコマンドをSourceforge.netから入手できます。いつも使っています。ファイルの内容を分析するには、8進ダンプコマンドの「od」をチェックしてください...
wwmbes

2

ex(インプレース)を使用してNULL文字を削除する方法の例を次に示します。

ex -s +"%s/\%x00//g" -cwq nulls.txt

複数のファイルの場合:

ex -s +'bufdo!%s/\%x00//g' -cxa *.txt

再帰性については、グロビングオプションを 使用できます**/*.txt(シェルでサポートされている場合)。

sed とその-iパラメーターは非標準のBSD拡張であるため、スクリプト作成に役立ちます。

参照:ファイルがバイナリファイルであるかどうかを確認し、そうでないファイルをすべて読み取る方法は?


1

私が使用した:

recode UTF-16..UTF-8 <filename>

ファイル内のゼロを取り除くため。


0

私は同じエラーに直面しました:

import codecs as cd
f=cd.open(filePath,'r','ISO-8859-1')

エンコーディングを次のように変更して問題を解決しました utf-16

f=cd.open(filePath,'r','utf-16')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.