Wie benutze ich sed, um null Bytes zu entfernen?

37

Was ist die sedBeschwörung, null Bytes aus einer Datei zu entfernen? Ich versuche es:

s/\000//g

aber das heißt, Nullenstrings herauszureißen.

s/\x00//g

scheint keine Wirkung zu haben. Ich versuche dies in einem sedSkript zu tun , daher bin ich mir nicht sicher, ob der echoTrick funktioniert.

Chris Curvey
quelle

Antworten:

40

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

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

Dies ist eine Lösung sed, die in einigen Fällen funktioniert, aber nicht in allen:

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

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

sed 's/\x0/ /g' file1 > file2
Tamara Wijsman
quelle
10
Das sieht nach einer sehr unvollständigen Antwort aus. warum sollte es bei manchen Gelegenheiten funktionieren und bei anderen nicht, und wenn ja, wäre ein Beispiel nicht nützlich?
Barlop
@barlop: Wegen der Art und Weise, wie es implementiert ist? Das OP hat keine spezifiziert und ich werde nicht jede einzelne Implementierung aufzählen ...
Tamara Wijsman
4
Nun, das klingt dann gut für mich, Sie sagen also, es kommt auf die Implementierung von SED an. Wenn Sie nicht gesagt hätten, dass Sie den möglichen Vorschlag offen gelassen hätten, dass eine Implementierung von SED abhängig von den Daten in der Datei Nullen aus einer Datei und nicht aus einer anderen Datei entfernen könnte.
Barlop
3
sollte es nicht "tr -d '\ 000' <Datei-mit-Nullen> Datei-ohne-Nullen" sein?
Seamus Abshere
1
Funktioniert bei mir ™. Ebenfalls nützlich: -iParameter zum Konvertieren der Datei.
Zbyszek
8

trstolperte über einige andere Bytes in meiner Datei und sedersetzte nichts. Ich habe es nicht in, sedsondern 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. Früher habe ich das hexdumpdebuggt.

fifi finanzen
quelle
3

Mit Perl können Sie ganz einfach einen regulären Ausdruck erstellen. Einfach ersetzen seddurch perl -np -e:

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

Mit dieser -nOption 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 -0Option 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 durch Ausführen nachschlagen perldoc perlrun.

Flimm
quelle
1

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

[^ \ x01- \ x7F]

Großer Papa
quelle
Dies ist die Antwort auf die Frage zu sed unter GNUWin32. Tatsächlich werden mehr als nur Nullen entfernt. Es kann für Sie funktionieren oder auch nicht, je nachdem, was Sie anpassen möchten und wie sed implementiert wird.
Itsme2003