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


37

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

s/\000//g

しかし、それはゼロの文字列を取り除きます。

s/\x00//g

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

回答:


40

を使用してこれを正確に達成する方法はわかりませんsedが、これは以下で動作するソリューションですtr

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

これはそのためのソリューションですsedが、すべてではない場合もあります:

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

これは、すべての場合に機能する文字をスペースに置き換えることを含むソリューションです。

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

10
それは非常に不完全な答えのように見えます。なぜそれがいくつかの機会で機能し、他の機会では機能しないのか、もしそうなら、例は役に立たないでしょうか?
barlop

@barlop:実装方法のせいですか?OPは1つを指定しなかったため、すべての実装を列挙するつもりはありません...
Tamara Wijsman

4
まあそれは私にはいいように聞こえるので、あなたはそれがSEDの実装に依存していると言っています。SEDの1つの実装が、ファイル内のデータに応じて、1つのファイルからnullを削除し、別のファイルからnullを削除しないという提案を開いたままにしていないと言わなかった場合
barlop

3
「tr -d '\ 000' <file-with-nulls> file-without-nulls」ではないでしょうか?
シーマスアブシャー

1
私のために働く™。また-i、ファイルを所定の場所に変換するパラメーターも便利です。
-zbyszek

8

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", ""))'

また、いくつかのコマンドは実際にヌルバイトをそこに残していますが、少なくともOSX端末では見えなくなりました。私はhexdumpこれをデバッグしていました。


3

Perlを使用して正規表現を実行するのは非常に簡単です。に置き換えsedてくださいperl -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

を実行すると、Perlのコマンドラインオプションを検索できますperldoc perlrun


1

nullバイトに一致させるには、CygwinのSEDでこの正規表現を使用します。

[^ \ x01- \ x7F]


これはGNUWin32でのsedの質問に対する答えです。実際には、単なるヌル以上のものを取り除きます。一致させる対象とsedの実装に応じて、機能する場合と機能しない場合があります。
Itsme2003
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.