web-dev-qa-db-ja.com

sedを使用してnullバイトを削除する方法

ファイルからnullバイトを削除するsedの呪文とは何ですか?私はしようとしています:

s/\000//g

しかし、それはゼロの文字列を取り除くことです。

s/\x00//g

効果がないようです。 sedスクリプトでこれを実行しようとしているので、echoトリックが機能するかどうかはわかりません。

40
Chris Curvey

sedでこれを正確に実現する方法はわかりませんが、これはtrで機能する解決策です。

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

これはsedの解決策であり、すべてではなく一部の状況で機能します。

sed 's/\x0//g' file1 > file2

これは、あらゆる状況で機能するはずのスペース文字への置換を含むソリューションです。

sed 's/\x0/ /g' file1 > file2
43
Tamara Wijsman

trがファイル内の他のバイトをトリップし、sedは何も置き換えませんでした。私はsedではなくPythonでそれをやった:

f = open('file-with-0bytes.dump')
for l in f.readlines():
  print l.replace("\0", '')

これがpipeableワンライナーです:

python -c 'import sys; sys.stdout.write(sys.stdin.read().replace("\0", ""))'

また、一部のコマンドでは実際にnullバイトがそこに残されていますが、少なくともOSX端末では表示されません。これをデバッグするためにhexdumpを使用しました。

8
kqw

Perlを使用して正規表現を実行するのは非常に簡単です。 sedPerl -np -eに置き換えるだけです。

$ printf 'one\0two\0' | Perl -np -e 's/\0/\n/g'
one
two

-nオプションを使用すると、sedと同様に、正規表現が1行ずつ実行されます。

レコードセパレータとしてゼロバイトを使用する場合は、Perlの-0オプションを使用します。

$ printf 'one\0two\0' | Perl -np0 -e 's/^/prefix /; s/\0/\n/g'
prefix one
prefix two
$ printf 'one\0two\0' | Perl -np -e 's/^/prefix /; s/\0/\n/g'
prefix one
two

perldoc perlrunを実行すると、Perlのコマンドラインオプションを調べることができます。

3
Flimm

Nullバイトを照合するために、私はこの正規表現をCygwinのSEDで使用します。

[^\x01-\x7F]

1
Big Daddy