한 파일의 내용을 다른 파일에서 찾아 FF로 바꿉니다.

한 파일의 내용을 다른 파일에서 찾아 FF로 바꿉니다.

나는 rockx.dat라는 바이너리 파일과 rockx_#.pmf라는 다른 바이너리 파일을 가지고 있습니다.

dat 파일에서 pmf 파일의 내용을 찾아 FF로 바꾸고 싶습니다. 그래서 pmf 파일이 500바이트라면 500FF바이트로 교체하고 싶습니다.

답변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}"

개행 대체에 대한 자세한 내용은 다음을 참조하세요.여기.
패턴 파일 생성에 관한 자세한 내용은 다음을 참조하세요.여기.
선 분할에 대한 자세한 내용은 다음을 참조하세요.여기.
이에 대한 자세한 내용은 xxd맨페이지를 참조하세요.

이는 하나의 패턴 대체에만 적용되지만 많은 노력 없이 여러 파일로 여러 대체를 제공하도록 이를 변경할 수 있어야 합니다.

관련 정보