Apakah ada cara untuk mendeteksi byte nol (␀, NUL, \ 0) secara sed?

15

Terkait dengan pertanyaan lain , untuk mendeteksi file biner, apakah ada cara untuk mendeteksi ␀ byte sed?

l0b0
sumber
Di GNU sed, ya, tetapi perhatikan bahwa pada banyak unix, utilitas teks tidak mampu menangani byte nol.
Gilles 'SO- stop being evil'

Jawaban:

17

Contoh:

Buktikan saya mengirim byte NUL, diikuti oleh baris baru:

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

Sekarang saya mengubah byte NUL ke !tanda seru:

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

Jadi triknya gunakan \x00sebagai NUL-byte.

jippie
sumber
3
Anda dapat echo -ne \\0menghindari garis baru.
l0b0
Ganti hexdump -Cdengan uniname -bcepuuntuk melihat karakter mana yang dibuangnya.
l0b0
6
Harus disebutkan bahwa itu \xadalah sedekstensi non-standar , tetapi GNUsed memang menyediakannya.
jw013
6
Hal ini juga harus disebutkan harus, yang echo -emerupakan bashism . printfjauh lebih kompatibel.
jofel
7

Ya, polanya \x00cocok dengan byte nol.

Contoh:

$ printf "\0\n\0\n" > file
$ sed -e 's/\x00/test/' -i file
$ cat file
test
test
$  
Jofel
sumber
@ l0b0: Alasannya, mengapa itu bekerja untuk saya, adalah karena saya menggunakan zsh. Menurut POSIX , itu menggantikan \0dengan byte nol. Penggantian ini tidak diperlukan ("harus didukung"), dan sebenarnya bash tidak mendukungnya secara langsung. Untuk itu, Anda perlu menggunakan echo -e. Saya ganti echodengan dengan printfjawaban saya yang tampaknya lebih kompatibel ...
jofel