web-dev-qa-db-ja.com

UNIXでのヌル文字の識別と削除

不要なヌル文字(ASCII NUL、\0)。 viで表示しようとすると、^@シンボル、通常のテキストでインターリーブされます。どうやって:

  1. ファイル内のどの行にヌル文字が含まれているかを特定しますか?私は\0および\x0、しかしこれは機能しませんでした。

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

81
dogbane

trを使用します:

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

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

107
Pointy

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

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

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

56
rekha_sri

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

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

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

次のコードを発見しました。どの行にヌル文字が含まれているかを出力します。

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

また、8進数のダンプは、nullがあるかどうかを示します。

od file-with-nulls | grep ' 000'
5
dogbane

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

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

および複数のファイルの場合:

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

再帰性のために、 globbing option**/*.txt(シェルでサポートされている場合)。

sedおよびその-iパラメータは、非標準のBSD拡張です。

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

2
kenorb

私が使用した:

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

ファイル内のゼロを取り除きます。

1
logisec

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

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

エンコーディングをutf-16に変更することで問題を解決しました

f=cd.open(filePath,'r','utf-16')
0
Ming Young