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.

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.