Есть ли способ обнаружить нулевые байты (␀, NUL, \ 0) в sed?

15

В связи с другим вопросом , для нечеткого обнаружения двоичных файлов, есть ли способ обнаружить байты в sed?

l0b0
источник
В GNU sed да, но обратите внимание, что во многих приложениях текстовые утилиты не способны обрабатывать нулевые байты.
Жиль "ТАК - перестань быть злым"

Ответы:

17

Пример:

Докажите, что я отправляю байт NUL, за которым следует новая строка:

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

Теперь я изменяю байт NUL на !восклицательный знак:

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

Так что хитрость заключается в использовании \x00NUL-байта.

jippie
источник
3
Вы можете echo -ne \\0избежать новой строки.
10
Замените hexdump -Cна, uniname -bcepuчтобы увидеть, какой символ он выбрасывает.
10
6
Следует отметить, что \xэто нестандартное sedрасширение, но GNUsed его предоставляет.
jw013
6
Следует также упомянуть, что echo -eэто башизм . printfгораздо более совместим.
Джофель
7

Да, шаблон \x00соответствует нулевому байту.

Пример:

$ printf "\0\n\0\n" > file
$ sed -e 's/\x00/test/' -i file
$ cat file
test
test
$  
jofel
источник
@ l0b0: причина, по которой это сработало для меня, была в том, что я использовал zsh. Согласно POSIX , он заменяется \0нулевым байтом. Эта замена не является необходимой («должна поддерживаться»), и фактически bash не поддерживает ее напрямую. Для этого вам нужно использовать echo -e. Я заменяю echoна printfв своем ответе, который кажется более совместимым ...
jofel