あるファイルの内容が別のファイルにあるかどうかを調べ、FFに置き換える

あるファイルの内容が別のファイルにあるかどうかを調べ、FFに置き換える

rockx.dat というバイナリ ファイルと、rockx_#.pmf という他のバイナリ ファイルがいくつかあります。

dat ファイル内の pmf ファイルの内容を検索し、それを FF に置き換えます。したがって、pmf ファイルが 500 バイトの場合、500 FF バイトに置き換えます。

答え1

xxdアプリケーションに使用できます。
バイナリ ファイルを処理するには、複数の手順が必要になります。

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

改行置換の詳細については、以下をご覧ください。ここ
パターンファイルの作成に関する詳細については、ここ
行分割の詳細については、こちらをご覧ください。ここ.
詳細については、xxdman ページを参照してください。

これは 1 つのパターン置換のみを対象としていますが、大きな労力をかけずに複数のファイルで複数の置換を提供するように変更できるはずです。

関連情報