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?


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.


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
$  

@ 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.