nullバイトを削除するためにsedを使用するには?

sed

ファイルからヌルバイトを削除するsedの呪文は何ですか?試しています

s/\000//g

しかし、それはゼロの文字列を剥ぎ取っていることになります

s/\x00//g

は効果がないようです。私はsedのスクリプトでやっているので、echoのトリックが効くかどうかはわかりません

  43  Chris Curvey  2011-05-24


ベストアンサー

具体的にどうやってsedで実現できるのかはわかりませんが、trで実現できる解決策です

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

これはsedのための解決策であり、いくつかの場面では機能するが、すべてではない

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

これは、すべての場面で動作するはずのスペース文字に置き換えることを含む解決策です

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

48  Tamara Wijsman  2011-05-24


trではファイル内の他のバイトに躓いてしまい、sedでは何も置き換えられませんでした。結局、sedではなく、Pythonでやってしまいました

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

ここにパイプの効いたワンライナーがあります

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

また、いくつかのコマンドが実際にはヌルバイトを残したままにしていることに気がつきましたが、少なくともOSXのターミナルでは見えなくなっています。これをデバッグするために hexdump を使ってみました

8  kqw  2012-10-25


Perlを使って正規表現を実行するのはとても簡単です。sedperl -np -eに置き換えるだけです

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

-n オプションを指定すると、 sed と同様に正規表現を一行ずつ実行します

レコードの区切り文字としてゼロバイトを使用したい場合は、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

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

4  Flimm  2014-02-14


ヌルバイトをマッチさせるために、CygwinのSEDでこの正規表現を使用しています

[^\x01-\x7F]

1  Big Daddy  2014-01-16


タイトルとURLをコピーしました