如何通过Bash脚本自动替换大文件中的指定十六进制值?
批量替换大文件中的特定十六进制串
单文件处理脚本
直接用xxd配合sed实现十六进制替换,同时做好文件备份避免数据丢失:
FILE='file.vpk' SEARCH_STRING='MaxRagdollCount' # 生成目标字符串的十六进制前缀 OLD_HEX_PREFIX=$(echo -n "$SEARCH_STRING" | xxd -p) # 定义替换后的完整十六进制串(对应"MaxRagdollCount" "9") TARGET_HEX="${OLD_HEX_PREFIX}2220223922" # 备份原文件 cp "$FILE" "${FILE}.bak" # 执行替换:转十六进制流→替换→转二进制 xxd -p "$FILE" | sed -E "s/${OLD_HEX_PREFIX}222022[0-9a-f]{2,4}22/${TARGET_HEX}/g" | xxd -r -p > "${FILE}.tmp" # 替换原文件 mv "${FILE}.tmp" "$FILE"
多文件批量处理脚本
如果需要处理多个.vpk文件,用循环遍历即可:
SEARCH_STRING='MaxRagdollCount' OLD_HEX_PREFIX=$(echo -n "$SEARCH_STRING" | xxd -p) TARGET_HEX="${OLD_HEX_PREFIX}2220223922" # 遍历当前目录下所有.vpk文件 for FILE in *.vpk; do if [ -f "$FILE" ]; then echo "Processing $FILE..." cp "$FILE" "${FILE}.bak" xxd -p "$FILE" | sed -E "s/${OLD_HEX_PREFIX}222022[0-9a-f]{2,4}22/${TARGET_HEX}/g" | xxd -r -p > "${FILE}.tmp" mv "${FILE}.tmp" "$FILE" echo "Done with $FILE" fi done
关键步骤说明
- 文件备份:操作前先复制原文件为
.bak后缀的备份,防止替换过程中出错导致数据损坏。 - 十六进制转换:
xxd -p将二进制文件转为无格式的连续十六进制字符串,方便文本工具处理;xxd -r -p则将处理后的十六进制串转回二进制文件。 - 正则匹配:
sed -E使用扩展正则表达式,匹配MaxRagdollCount" "后面1-2位数字的十六进制串([0-9a-f]{2,4}对应1位数字占2个十六进制字符,2位数字占4个),并替换为目标串。
验证替换结果
处理完成后,可通过你原有的代码验证是否替换成功:
FILE='file.vpk' SEARCH_STRING='MaxRagdollCount' OLD_HEX_VALUE="$( echo -n "$SEARCH_STRING" | xxd -p )" HEX_VALUE=($( xxd -p "$FILE" | grep -E -o "${OLD_HEX_VALUE}222022[0-9]{,2}22" )) echo "$HEX_VALUE"
输出应为替换后的十六进制串:4d6178526167646f6c6c436f756e742220223922
内容的提问来源于stack exchange,提问作者Paweł Selen
相关产品推荐
相关产品推荐

