Другое решение в sed
, но с использованием меньшего количества памяти:
xxd -c1 -p file |
sed -n -e '1{N;N;N}' -e '/ff\nd8\nff\nd0/{:begin;p;s/.*//;n;bbegin}' -e 'N;D' |
sed -n -e '1{N;N}' -e '/aa\nff\nd9/{p;Q1}' -e 'P;N;D' |
xxd -r -p > new_file
test ${PIPESTATUS[2]} -eq 1 || rm new_file
1-й sed
печатает от ff d8 ff d0
до конца файла. Обратите внимание, что вам нужно N
в -e '1{N;N;N}'
столько, сколько есть байтов в вашем 1-м паттерне минус один .
2-й sed
печатает от начала файла до aa ff d9
. Еще раз обратите внимание, что вам нужно столько N
в -e '1{N;N}'
, сколько есть байтов во втором шаблоне минус один .
Опять же, необходим тест, чтобы проверить, найден ли второй шаблон, и удалите файл, если его нет.
Обратите внимание, что команда Q
является расширением GNU до sed
. Если у вас его нет, вам нужно удалить оставшуюся часть файла, как только будет найден шаблон (в цикле, подобном 1-му sed
, но не печатать файл), и проверить после преобразования в шестнадцатеричный формат в двоичный, что конец new_file заканчивается с узором Райт.