Encontre o conteúdo de um arquivo em outro e substitua por FF

Encontre o conteúdo de um arquivo em outro e substitua por FF

Eu tenho um arquivo binário chamado rockx.dat e vários outros arquivos binários rockx_#.pmf.

Quero encontrar o conteúdo dos arquivos pmf no arquivo dat e substituí-los por FF. Portanto, se o arquivo pmf tiver 500 bytes, quero substituí-lo por 500 bytes FF.

Responder1

Você pode usar xxdpara sua aplicação.
Para processar o arquivo binário, você precisaria de várias etapas:

#!/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 obter mais informações sobre a substituição de nova linha, dê uma olhadaaqui.
Para obter mais informações sobre a criação do arquivo de padrão, dê uma olhadaaqui.
Para obter informações sobre a divisão de linha, dê uma olhadaaqui.
E para obter informações sobre, xxddê uma olhada na página de manual.

Observe que isso é apenas para uma substituição de padrão, mas deve ser possível alterar isso para servir múltiplas substituições com vários arquivos sem muito esforço.

informação relacionada