そのため、既存のハードドライブからテキストファイルを回復しましたが、すべてのデータを完全に回復することはできませんでした。正しく回復されなかったデータはヌルバイトで返されました。これらのバイトを含むファイルからすべての行をどのように削除できますか?
破損したデータの例
xE3
xAF
xE2
xBF
NUL
xBD
もっとあります...
NULL が \x00 に等しいことを知っています。
バイトを個別に削除するのではなく、sedを使用して破損したデータを含むすべての行を削除するにはどうすればよいですか?
バイト/破損したデータにはさまざまなバリエーションがあり、正規表現でこれをすべて見つけることができるかどうか疑問です。
答え1
バイト 0 またはバイト 128 ~ 255 を含む行を削除するには、次を使用できます。
perl -ne 'print unless /[\0\200-\377]/'
または、grep
PCREサポートでGNUを使用してください。
LC_ALL=C grep -vaP '[\0\200-\377]'
strings
データから印刷可能なテキストを抽出するコマンドも参照してください。
このバイトを削除するには:
tr -d '\0\200-\377'
答え2
次のPerlコマンドを試すことができます。
<in_file perl -lne's/\0//g; print if $_'
in_file
入力です。パイプリダイレクトを使用できます。
グローバルにNULを削除します。必要に応じて正規表現を調整できます。
答え3
yourfile
gnu sedを使用して、nullバイトを含むすべての行を削除できます。
sed '/\x0/d' yourfile
これはパイプでも機能します。
cat yourfile | sed '/\x0/d'
答え4
はい。次のことができます。
sed -e '/\x00/d' [filename] > [new_filename]
ファイルを内部で編集したい場合:
sed -i '/\x00/d' [filename]
2つを組み合わせて元のファイルを変更し、バックアップコピーをアーカイブすることもできます。
sed -i~ '/\x00/d' [filename]
これにより、ファイルから少なくとも1つのNULLを含むすべての行が削除されます。