如何用Bash命令替换二进制文件中字符串为对应长度空字节
二进制文件字符串替换为等长空字节的Bash方案
可以用两种简洁的方法实现,适配任意目标字符串,无需手动输入大量\0:
方法一:Perl 命令(推荐,最简洁)
Perl 对二进制文件处理友好,能直接动态生成等长的空字节序列:
# 定义要替换的目标字符串 TARGET_STR="example_str" # 执行替换,生成临时文件后覆盖原文件(可添加.bak生成备份) perl -0777 -pe "s/\Q$TARGET_STR\E/\x00" x length($TARGET_STR) "/g" example_file > temp_file && mv temp_file example_file
参数说明:
-0777:让 Perl 一次性读取整个文件,避免二进制中的特殊字符(如换行符)打断处理-pe:循环处理输入并打印结果\Q$TARGET_STR\E:自动转义目标字符串中的正则特殊字符(如.、*),确保精准匹配\x00" x length($TARGET_STR):生成与目标字符串长度完全一致的空字节序列
如果想直接修改原文件并自动生成备份,可改用:
perl -0777 -i.bak -pe "s/\Q$TARGET_STR\E/\x00" x length($TARGET_STR) "/g" example_file
执行后会保留原文件为 example_file.bak。
方法二:xxd + sed 组合(依赖系统基础工具)
通过将二进制文件转成十六进制文本进行替换,再转回二进制,适合没有 Perl 的环境:
TARGET_STR="example_str" # 把目标字符串转为十六进制格式 TARGET_HEX=$(echo -n "$TARGET_STR" | xxd -p | tr -d '\n') # 生成对应长度的空字节十六进制(每个空字节对应"00") NULL_HEX=$(printf '00%.0s' $(seq 1 ${#TARGET_STR})) # 转换格式、替换、转回二进制 xxd -p example_file | sed "s/$TARGET_HEX/$NULL_HEX/g" | xxd -p -r > temp_file && mv temp_file example_file
步骤说明:
xxd -p:将二进制文件转为无格式的纯十六进制字符串printf '00%.0s' ...:根据目标字符串长度生成连续的00序列sed替换后,xxd -p -r将十六进制字符串还原为二进制文件
注意事项:
- 操作前建议备份原文件,避免意外数据丢失
- 若目标字符串包含特殊二进制字符,两种方法都能稳定处理
内容的提问来源于stack exchange,提问作者AvidCoder
相关产品推荐
相关产品推荐

