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?


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.


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
$  

@ 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.