it-swarm.com.de

Wie benutze ich sed, um null Bytes zu entfernen?

Was ist die sed-Beschwörung zum Entfernen von Null-Bytes aus einer Datei? Ich versuche:

s/\000//g

aber das heißt, Nullenstrings herauszureißen.

s/\x00//g

scheint keine Wirkung zu haben. Ich versuche dies in einem sed-Skript zu tun, daher bin ich mir nicht sicher, ob der echo-Trick funktioniert.

35
Chris Curvey

Ich weiß nicht genau, wie Sie dies mit sed erreichen können, aber dies ist eine Lösung, die mit tr funktioniert:

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

Dies ist eine Lösung für sed, die in einigen Fällen, jedoch nicht in allen Fällen, funktioniert:

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

Dies ist eine Lösung, die das Ersetzen von Zeichen in Leerzeichen beinhaltet, die in allen Situationen funktionieren sollten:

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

tr hat über einige andere Bytes in meiner Datei gestolpert und sed hat nichts ersetzt. Ich habe es letztendlich nicht in sed sondern in Python gemacht:

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

Hier ist ein pipeable Einzeiler:

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

Ich habe auch bemerkt, dass einige Befehle tatsächlich die Null-Bytes dort belassen, aber sie sind nicht mehr sichtbar, zumindest nicht in einem OSX-Terminal. Ich habe hexdump verwendet, um dies zu debuggen.

8
guaka

Mit Perl können Sie ganz einfach einen regulären Ausdruck erstellen. Ersetzen Sie einfach sed durch Perl -np -e:

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

Mit der Option -n werden reguläre Ausdrücke wie sed Zeile für Zeile ausgeführt.

Wenn Sie Null-Bytes als Datensatztrennzeichen verwenden möchten, verwenden Sie die Option -0 von Perl.

$ 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

Sie können die Befehlszeilenoptionen von Perl nachschlagen, indem Sie perldoc perlrun ausführen.

3
Flimm

Um ein Null-Byte abzugleichen, verwende ich diesen regulären Ausdruck mit Cygwins SED:

[^\x01-\x7F]

1
Big Daddy