Tengo un archivo binario llamado rockx.dat y muchos otros archivos binarios rockx_#.pmf.
Quiero encontrar el contenido de los archivos pmf en el archivo dat y reemplazarlos con FF. Entonces, si el archivo pmf tiene 500 bytes, quiero reemplazarlo con 500 FF bytes.
Respuesta1
Podrías usarlo xxd
para tu aplicación.
Para procesar el archivo binario necesitaría varios pasos:
#!/bin/bash
file_orig="rockx.dat"
file_subst="rockx_0.pmf"
# could use tmpfile here
tmp_ascii_orig="rockx.ascii"
tmp_ascii_subst="subst.ascii"
# convert files to ascii for further processing
xxd -p "${file_orig}" "${tmp_ascii_orig}"
xxd -p "${file_subst}" "${tmp_ascii_subst}"
# remove newlines in converted files to ease processing
sed -i ':a;N;$!ba;s/\n//g' "${tmp_ascii_orig}"
sed -i ':a;N;$!ba;s/\n//g' "${tmp_ascii_subst}"
# create a 0xff pattern file for pattern substitution
ones_file="ones.ascii"
dd if=<(yes ff | tr -d "\n") of="${ones_file}" count="$(($(stat -c %s "${tmp_ascii_subst}") - 1))" bs=1
# substitute the pattern in the original file
sed -i "s/$(cat "${tmp_ascii_subst}")/$(cat "${ones_file}")/" "${tmp_ascii_orig}"
# split the lines again to allow conversion back to binary
sed -i 's/.\{60\}/&\n/g' "${tmp_ascii_orig}"
# convert back
xxd -p -r "${tmp_ascii_orig}" "${file_orig}"
Para obtener más información sobre la sustitución de nueva línea, eche un vistazoaquí.
Para obtener más información sobre la creación de archivos de patrones, eche un vistazoaquí.
Para obtener información sobre la división de líneas, eche un vistazoaquí.
Y para obtener información sobre esto, xxd
consulte la página de manual.
Tenga en cuenta que esto es solo para una sustitución de patrón, pero debería ser posible cambiarlo para servir múltiples sustituciones con múltiples archivos sin gran esfuerzo.