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?


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.


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
$  

@ 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.