¿Hay alguna manera de detectar bytes nulos (␀, NUL, \ 0) en sed?

15

En relación con otra pregunta , para detectar de forma difusa archivos binarios, ¿hay alguna forma de detectar ␀ bytes sed?

l0b0
fuente
En GNU sed, sí, pero tenga en cuenta que en muchas unidades, las utilidades de texto no son capaces de manejar bytes nulos.
Gilles 'SO- deja de ser malvado'

Respuestas:

17

Ejemplo:

Demuestre que estoy enviando un byte NUL, seguido de una nueva línea:

$ echo -e \\0 | hexdump -C
00000000  00 0a                                             |..|
00000002

Ahora cambio el byte NUL a un !signo de exclamación:

$ echo -e \\0 | sed 's/\x00/!/' | hexdump -C
00000000  21 0a                                             |!.|

Entonces el truco es usar \x00como NUL-byte

jippie
fuente
3
Puede echo -ne \\0evitar una nueva línea.
l0b0
Reemplace hexdump -Ccon uniname -bcepupara ver qué carácter volca.
l0b0
66
Cabe mencionar que \xes una sedextensión no estándar , pero GNU lased proporciona.
jw013
66
También debe mencionarse, eso echo -ees un bashismo . printfEs mucho más compatible.
jofel
7

Sí, el patrón \x00coincide con el byte nulo.

Ejemplo:

$ printf "\0\n\0\n" > file
$ sed -e 's/\x00/test/' -i file
$ cat file
test
test
$  
jofel
fuente
@ l0b0: La razón por la que funcionó para mí fue que usé zsh. Según POSIX , reemplaza \0por el byte cero. Este reemplazo no es necesario ("se admitirá"), y en realidad bash no lo admite directamente. Para ello, necesitas usar echo -e. Reemplazo echocon printfen mi respuesta, que parece ser más compatible ...
jofel