Existe uma maneira de detectar bytes nulos (␀, NUL, \ 0) no sed?

15

Relacionado a outra pergunta , para detectar arquivos binários de maneira imprecisa, existe uma maneira de detectar ␀ bytes sed?

l0b0
fonte
No GNU sed, sim, mas observe que em muitos unis, os utilitários de texto não são capazes de lidar com bytes nulos.
Gilles 'SO- stop be evil'

Respostas:

16

Exemplo:

Prove que estou enviando um byte NUL, seguido por uma nova linha:

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

Agora altero o byte NUL para um !ponto de exclamação:

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

Portanto, o truque é usar \x00como NUL-byte.

jippie
fonte
3
Você pode echo -ne \\0evitar uma nova linha.
precisa saber é o seguinte
Substitua hexdump -Cpor uniname -bcepupara ver qual caractere ele despeja.
l0b0
6
Deve-se mencionar que \xé uma sedextensão não-padrão , mas o GNUsed fornece.
jw013
6
Também deve ser mencionado, que echo -eé um basismo . printfé muito mais compatível.
Jofel
7

Sim, o padrão \x00corresponde ao byte nulo.

Exemplo:

$ printf "\0\n\0\n" > file
$ sed -e 's/\x00/test/' -i file
$ cat file
test
test
$  
jofel
fonte
@ l0b0: A razão pela qual funcionou para mim foi o uso do zsh. De acordo com o POSIX , ele substitui \0o byte zero. Essa substituição não é necessária ("deve ser suportada") e, na verdade, o bash não a suporta diretamente. Para isso, você precisa usar echo -e. Eu substituir echocom com printfna minha resposta que parece ser mais compatível ...
Jofel