Otra solución en sed
, pero utilizando menos memoria:
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
La primera sed
imprime desde ff d8 ff d0
hasta el final del archivo. Tenga en cuenta que necesita tantos N
en -e '1{N;N;N}'
, ya que hay bytes en su primer patrón menos uno.
La 2da sed
imprime desde el comienzo del archivo a aa ff d9
. Tenga en cuenta nuevamente que necesita tantos N
en -e '1{N;N}'
como hay bytes en su segundo patrón menos uno.
De nuevo, se necesita una prueba para comprobar si se encuentra el 2º patrón, y eliminar el archivo si no lo está.
Tenga en cuenta que el comando Q
es una extensión de GNU a sed
. Si no lo tiene, debe trash el resto del archivo una vez que se encuentre el patrón (en un ciclo como el 1er sed
, pero no imprimir el archivo), y verifique después de la conversión de hexadecimal a binario que el archivo_nuevo termine con el patrón de wright.
Sin embargo, otra reasignación de marca: la solución de 'Irager' falla si se puede encontrar el 2 ° patrón antes del 1 °, dando $ len con signo negativo. Esta solución busca después de la coincidencia del primer patrón, por lo que no tiene ese problema ni genera un archivo intermedio de tamaño triple. – theta
Después de probar esto más, lo encontré sin problemas, pero es bastante lento en archivos más grandes. ¿Alguien ve un lugar para alguna optimización, o este es el mejor que se puede obtener de xxd/awk? – theta
Pruebe la nueva versión 'sed' que acabo de publicar. Éste se puede optimizar reemplazando la concatenación y extracción de cadenas con índices rotatorios en matrices, pero es menos legible; y no quiero hacerlo si no es necesario ;-). – jfg956