如何用Bash脚本通过十六进制操作修改二进制文件中的日期
解决方案:替换二进制文件中的十六进制串
我完全懂你的困扰——非文本编码的文件确实没法用普通文本工具直接处理,sed这类工具对二进制文件的支持很差。不过有几个专门处理二进制与十六进制转换的工具能完美解决这个问题,下面给你两个最靠谱的方案:
方案1:用xxd工具(最推荐)
xxd是大多数Linux/Unix系统默认自带的工具,专门用来在二进制文件和十六进制文本之间转换,处理这种替换需求非常顺手。
直接运行这条命令即可:
xxd myfile | sed 's/3035303832303139/3034313032303232/g' | xxd -r > newfile
命令拆解:
xxd myfile:把原二进制文件转换成带地址标注的十六进制文本格式,这样sed就能正确识别并替换目标串了sed 's/原十六进制串/新十六进制串/g':这里要注意用十六进制值替换,原日期05082019对应3035303832303139,新日期04102022对应3034313032303232xxd -r:把修改后的十六进制文本重新转换回二进制格式,输出到newfile
方案2:用hexdump+xxd组合
如果你习惯用hexdump,也可以用纯十六进制字符串的方式处理:
hexdump -ve '1/1 "%.2x"' myfile | sed 's/3035303832303139/3034313032303232/g' | xxd -r -p > newfile
命令拆解:
hexdump -ve '1/1 "%.2x"' myfile:生成不带任何额外信息的纯十六进制字符串- sed替换逻辑和方案1一致
xxd -r -p:-p参数表示处理纯十六进制字符串(不需要地址行),转换回二进制
为什么之前的方法失败?
- 直接用sed处理原文件:sed是文本行处理工具,二进制文件中的字节可能被sed识别为换行符或不可打印字符,导致目标十六进制串被拆分成多行,根本匹配不到
- 转十六进制字符串后直接写入:这样生成的是纯文本格式的十六进制字符,不是原文件的二进制格式,自然无法正常使用
验证替换结果
生成新文件后,可以用这条命令确认替换是否成功:
hexdump -C newfile | grep '3034313032303232'
如果能输出匹配行,说明替换成功啦!
内容的提问来源于stack exchange,提问作者Ablia
相关产品推荐
相关产品推荐

