Existe-t-il un moyen de détecter les octets nuls (␀, NUL, \ 0) dans sed?

15

Relié à une autre question , afin de détecter de manière floue les fichiers binaires, existe-t-il un moyen de détecter ␀ octets sed?

l0b0
la source
Dans GNU sed, oui, mais notez que sur de nombreux unités, les utilitaires de texte ne sont pas capables de gérer des octets nuls.
Gilles 'SO- arrête d'être méchant'

Réponses:

17

Exemple:

Prouvez que j'envoie un octet NUL, suivi d'une nouvelle ligne:

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

Maintenant, je change l'octet NUL en un !point d' exclamation:

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

Donc, l'astuce consiste à utiliser \x00comme octet NUL.

jippie
la source
3
Vous pouvez echo -ne \\0éviter une nouvelle ligne.
l0b0
Remplacez hexdump -Cpar uniname -bcepupour voir quel caractère il vide.
l0b0
6
Il convient de mentionner qu'il \xs'agit d'une sedextension non standard , mais GNU lased fournit.
jw013
6
Il convient également de mentionner, c'est echo -eun bashisme . printfest beaucoup plus compatible.
jofel
7

Oui, le modèle \x00correspond à l'octet nul.

Exemple:

$ printf "\0\n\0\n" > file
$ sed -e 's/\x00/test/' -i file
$ cat file
test
test
$  
jofel
la source
@ l0b0: La raison pour laquelle cela a fonctionné pour moi, c'est que j'ai utilisé zsh. Selon POSIX , il remplace \0par l'octet zéro. Ce remplacement n'est pas nécessaire ("doit être pris en charge"), et en fait bash ne le prend pas directement en charge. Pour cela, vous devez utiliser echo -e. Je remplace echopar avec printfdans ma réponse qui semble être plus compatible ...
jofel