1

У меня есть некоторые двоичные данные, которые передаются через конвейер bash. Размер данных обычно превышает 50 МБ.

Существующий код выглядит примерно так

inputprocess | filter1 | filter2 | filter3 > result.txt

Я знаю, что есть плохие значения в 30000-30099 байтах после первого фильтра в потоке. Я знаю, какими должны быть значения. Мне просто нужно заменить плохие байты хорошими. Там нет изменений в длине данных.

Если бы это было на основе строки, я бы использовал что-то вроде:

inputprocess | filter1 | sed -e'SOMETHING' | filter2 | filter2 > result.txt

Однако я не уверен, что должно идти вместо sed при работе с данными bindary.

2 ответа2

2

sed ориентирован на строки и не подходит для проблем с двоичными данными. Тем не менее, head и tail будут работать:

inputprocess | filter1  | { head -c29999 ; echo -n "replacement" ; tail -c+100 ; } | filter2 | filter3 > result.txt

head -c29999 первые 29,999 байт на стандартный вывод. Затем текст замены отправляется на стандартный вывод. Затем tail -c+100 пропускает следующие 100 байтов ввода (те, которые вы хотели заменить) и копирует остальные в стандартный вывод.

Это работает при условии, что head читает не дальше, чем нужно. Это работает под head GNU. Однако в системах, отличных от Linux, может потребоваться проверить, является ли команда head жадной.

0

Если вы хотите пойти по маршруту sed(1), вы также можете добавить hexdump(1) и xxd(1) в канал:

$>echo Hello | hexdump -ve '1/1 "%.2X"' | sed 's/48656C6C6F/476F6F64627965/' | xxd -r -p
Goodbye

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .