web-dev-qa-db-ja.com

テキストファイル(bash_historyなど)から「バイナリデータ」を削除するにはどうすればよいですか?

次のような質問で議論されているように:

そのgrepは、バイナリと見なすファイルの処理を停止する可能性があります。

これは通常大きな問題ではありませんが、テキストファイルを検索すると、一部のテキストファイルが「ダーティ」である、つまりバイナリデータが含まれていることがあります。

この質問の動機となる私の特定のケースは、何らかのバイナリデータ(grepによってバイナリと見なされるものは何でも、引用された質問を参照)が.bash_historyファイルに侵入したため、削除したいというものです。

テキストファイルからバイナリデータを削除するにはどうすればよいですか?

バイナリデータを削除するだけでなく、必要な/重要なものの削除を回避するために、問題のある(grepにとって)バイナリデータを確認できることを願っています。

1
cat -v .bash_history > newbashhistory

Newbashhistoryを見て、気に入ったかどうかを判断します

6
icarus

テキスト以外のデータを含む行を表示する1つの方法は、次のとおりです。

_Perl -nle 'print if m/[^ -~\t\r]/' .bash_history | hexdump -C
_

基本的に、スペース内の文字not(_^_)と一致する場合は、行をチルダ範囲(ascii(7)のレビューによると、印刷可能なもの)で印刷します。他のいくつかのテキストではなく大丈夫な文字(改行は_-l_フラグによって魔法のように処理される必要があります)。

これらの行のバイナリコンテンツが破棄しても問題ないように見える場合は、次のような方法で削除できます。

_Perl -i.whoopsie -ple 's/[^ -~\t\r]//g' .bash_history
_

そしておそらく使用する

_cmp -l .bash_history.whoopsie .bash_history
_

正しいバイナリが破棄されたことを確認します。

3
thrig