Czy istnieje sposób na wykrycie pustych bajtów (␀, NUL, \ 0) w sed?

15

Powiązane z innym pytaniem , aby w niewyraźny sposób wykrywać pliki binarne, czy istnieje sposób na wykrycie ␀ bajtów sed?

l0b0
źródło
W GNU sed tak, ale zauważ, że w wielu jednorożcach narzędzia tekstowe nie są w stanie obsłużyć bajtów zerowych.
Gilles 'SO - przestań być zły'

Odpowiedzi:

17

Przykład:

Udowodnij, że wysyłam bajt NUL, a następnie nowy wiersz:

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

Teraz zmieniam bajt NUL na !wykrzyknik:

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

Więc sztuczka jest używana \x00jako bajt NUL.

jippie
źródło
3
Możesz echo -ne \\0uniknąć nowej linii.
l0b0
Wymień hexdump -Csię uniname -bcepu, aby zobaczyć, który to znak wysypisk.
l0b0
6
Należy wspomnieć, że \xjest to niestandardowe sedrozszerzenie, ale GNUsed je zapewnia.
jw013
6
Należy również wspomnieć, to echo -ejest bashism . printfjest znacznie bardziej kompatybilny.
jofel
7

Tak, wzór \x00pasuje do bajtu zerowego.

Przykład:

$ printf "\0\n\0\n" > file
$ sed -e 's/\x00/test/' -i file
$ cat file
test
test
$  
Jofel
źródło
@ l0b0: Powodem, dla którego to zadziałało, było użycie Zsh. Według POSIX zastępuje \0go bajtem zerowym. Ta zamiana nie jest konieczna („będzie obsługiwana”), a bash nie obsługuje jej bezpośrednio. Do tego musisz użyć echo -e. Zamieniam na echoz printfw odpowiedzi, która wydaje się bardziej zgodna ...
jofel