Cambiar rango de bytes por dirección en tubería

1

Tengo algunos datos binarios que se transmiten a través de una tubería de bash. Los datos suelen tener más de 50 MB de tamaño.

El código existente se ve más o menos así

inputprocess | filter1 | filter2 | filter3 > result.txt

Sé que hay valores incorrectos en los 30000-30099 bytes después del primer filtro en la secuencia. Sé cuáles deberían ser los valores. Solo necesito reemplazar los bytes malos con los buenos. No hay cambios en la longitud de los datos.

Si esto se basara en la línea, usaría algo como:

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

Sin embargo, no estoy seguro de qué debería reemplazar sedal trabajar con datos binarios.

Michael Anderson
fuente

Respuestas:

2

sedestá orientado a líneas y no es un ajuste natural para problemas con datos binarios. Sin embargo, heady tailfuncionará:

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

head -c29999Echos los primeros 29,999 bytes a stdout. Luego, el texto de reemplazo se envía a stdout. Luego, tail -c+100omite los siguientes 100 bytes de entrada (los que desea reemplazar) y copia el resto en stdout.

Esto funciona asumiendo headlecturas no más allá de lo necesario. Esto funciona bajo GNU head. Sin embargo, en sistemas que no son de Linux, es posible que sea necesario verificar si el headcomando es codicioso.

John1024
fuente
0

Si desea ir a la ruta sed (1), puede agregar hexdump (1) y xxd (1) a la tubería también:

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