Inhalt einer Datei in einer anderen suchen und durch FF ersetzen

Inhalt einer Datei in einer anderen suchen und durch FF ersetzen

Ich habe eine Binärdatei namens rockx.dat und eine Reihe anderer Binärdateien namens rockx_#.pmf.

Ich möchte den Inhalt der PMF-Dateien in der DAT-Datei finden und durch FF ersetzen. Wenn die PMF-Datei also 500 Byte groß ist, möchte ich sie durch 500 FF-Bytes ersetzen.

Antwort1

Sie könnten es xxdfür Ihre Anwendung verwenden.
Um die Binärdatei zu verarbeiten, wären mehrere Schritte erforderlich:

#!/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}"

Weitere Informationen zur Newline-Ersetzung finden Sie unterHier
Weitere Informationen zur Erstellung von Musterdateien finden Sie unterHierInformationen
zur Zeilenaufteilung finden Sie unterHier.
Weitere Informationen finden xxdSie in der Manpage.

Bitte beachten Sie, dass dies nur für eine Musterersetzung gilt, es jedoch möglich sein sollte, dies ohne großen Aufwand zu ändern, um mehrere Ersetzungen mit mehreren Dateien bereitzustellen.

verwandte Informationen