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


15

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


В 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-байта.


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
$  

@ l0b0: причина, по которой это сработало для меня, была в том, что я использовал zsh. Согласно POSIX , он заменяется \0нулевым байтом. Эта замена не является необходимой («должна поддерживаться»), и фактически bash не поддерживает ее напрямую. Для этого вам нужно использовать echo -e. Я заменяю echoна printfв своем ответе, который кажется более совместимым ...
jofel
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.