Come usare sed per rimuovere byte null?


37

Qual è l' sedincantesimo per rimuovere byte null da un file? Sto provando:

s/\000//g

ma questo sta eliminando le stringhe di zero.

s/\x00//g

sembra non avere alcun effetto. Sto provando a farlo in una sedsceneggiatura, quindi non sono sicuro che il echotrucco funzionerà.

Risposte:


40

Non so come si possa ottenere esattamente questo risultato sed, ma questa è una soluzione che funziona con tr:

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

Questa è una soluzione sedche funziona in alcune occasioni ma non tutte:

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

Questa è una soluzione che prevede la sostituzione nello spazio di caratteri che dovrebbero funzionare in tutte le occasioni:

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

10
sembra una risposta molto incompleta. perché dovrebbe funzionare in alcune occasioni e non in altre, e in tal caso un esempio non sarebbe utile?
barlop,

@barlop: a causa del modo in cui è implementato? L'OP non ne ha specificato uno e non ho intenzione di elencare ogni singola implementazione ...
Tamara Wijsman

4
Bene, allora suona bene per me, quindi stai dicendo che dipende dall'implementazione di SED. Se non avessi detto che avresti lasciato aperto il possibile suggerimento che un'implementazione di SED potrebbe rimuovere i null da un file e non da un altro file, a seconda dei dati nel file.
barlop,

3
non dovrebbe essere "tr -d '\ 000' <file-con-null> file-senza-null"?
Seamus Abshere,

1
Funziona per me ™. Utile anche: -iparametro per convertire il file in atto.
zbyszek,

8

trinciampato su alcuni altri byte nel mio file e sednon ha sostituito nulla. Ho finito per farlo non in sedma in Python:

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

Ecco un one-liner tubabile :

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

Ho anche notato che alcuni comandi in realtà lasciano i byte null lì, ma non sono più visibili, almeno non in un terminale OSX. Lo hexdumpeseguivo per il debug.


3

È abbastanza facile usare Perl per eseguire una regex. Sostituisci semplicemente sedcon perl -np -e:

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

Con l' -nopzione, le regex vengono eseguite riga per riga, proprio come sed.

Se si desidera utilizzare zero byte come separatori di record, utilizzare l' -0opzione 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

È possibile cercare le opzioni della riga di comando di Perl eseguendo perldoc perlrun.


1

Per abbinare un byte null, uso questo regex con il SED di Cygwin:

[^ \ X01- \ x7F]


Questa è la risposta alla domanda per sed su GNUWin32. In realtà si elimina più di semplici null. Potrebbe funzionare o meno per te a seconda di ciò che desideri abbinare e dell'implementazione di sed.
Itsme2003,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.