¿Cómo usar sed para eliminar bytes nulos?

37

¿Cuál es el sedencantamiento para eliminar bytes nulos de un archivo? Lo estoy intentando:

s/\000//g

pero eso es eliminar cadenas de ceros.

s/\x00//g

Parece no tener efecto. Estoy tratando de hacer esto en un sedscript, así que no estoy seguro de que el echotruco funcione.

Chris Curvey
fuente

Respuestas:

40

No sé cómo puedes lograr esto exactamente sed, pero esta es una solución que funciona con tr:

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

Esta es una solución sedque funciona en algunas ocasiones pero no en todas:

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

Esta es una solución que implica reemplazar en el espacio caracteres que deberían funcionar en todas las ocasiones:

sed 's/\x0/ /g' file1 > file2
Tamara Wijsman
fuente
10
eso parece una respuesta muy incompleta. ¿por qué funcionaría en algunas ocasiones y no en otras, y de ser así, no sería útil un ejemplo?
barlop
@barlop: ¿Por la forma en que se implementa? El OP no especificó uno y no voy a enumerar cada implementación ...
Tamara Wijsman
44
Bueno, eso me suena bien, entonces estás diciendo que depende de la implementación de SED. Si no hubiera dicho que habría dejado abierta la posible sugerencia de que una implementación de SED puede eliminar los valores nulos de un archivo y no de otro archivo, dependiendo de los datos del archivo.
barlop
3
¿No debería ser "tr -d '\ 000' <archivo-con-nulos> archivo-sin-nulos"?
Seamus Abshere
1
Funciona para mí ™. También útil: -iparámetro para convertir el archivo en su lugar.
zbyszek
8

trtropecé con algunos otros bytes en mi archivo y sedno reemplacé nada. Terminé haciéndolo no seden Python:

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

Aquí hay una línea de tubería :

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

También noté que algunos comandos realmente dejan los bytes nulos allí, pero ya no son visibles, al menos no en un terminal OSX. Solía hexdumpdepurar esto.

Fifi Finance
fuente
3

Es bastante fácil usar Perl para realizar una expresión regular. Simplemente reemplace sedcon perl -np -e:

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

Con la -nopción, las expresiones regulares se ejecutan línea por línea, al igual que sed.

Si desea utilizar cero bytes como separadores de registros, use la -0opción de 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

Puede buscar las opciones de línea de comandos de Perl ejecutando perldoc perlrun.

Flimm
fuente
1

Para hacer coincidir un byte nulo, uso esta expresión regular con SED de Cygwin:

[^ \ x01- \ x7F]

Papá grande
fuente
Esta es la respuesta a la pregunta para sed en GNUWin32. En realidad, elimina más que solo nulos. Puede o no funcionar para usted dependiendo de lo que desee hacer coincidir y la implementación de sed.
Itsme2003