如何基于预定义替换规则文件,批量对多个文件执行字符串替换?
批量多字符串替换Unix工具实现方案
适用工具
最适合的Unix工具组合是sed + awk,不需要引入Python等更重的工具,完全可以通过基础命令行工具实现需求。
实现步骤
步骤1:生成sed替换规则
你当前的substs.csv格式无需调整,直接通过awk将每行的替换对转换为sed的替换语法即可:
# 输出规则到临时sed脚本文件 awk -F ', ' '{print "s/"$1"/"$2"/g"}' substs.csv > replace.sed
如果你的搜索字符串或替换字符串中包含/字符,可以替换sed的分隔符为其他不冲突的符号(比如#),避免转义麻烦:
# 改用#作为分隔符的版本 awk -F ', ' '{print "s#"$1"#"$2"#g"}' substs.csv > replace.sed
步骤2:执行批量替换
处理单个目标文件的命令如下:
下述
-i.bak的写法同时兼容GNU sed(Linux默认)和BSD sed(macOS默认),不需要额外调整参数,执行后会自动生成.bak后缀的备份文件,防止操作失误。
sed -i.bak -f replace.sed 你的目标文件
如果需要批量处理多个文件,可以通过循环实现:
# 示例:批量处理当前目录下所有.txt文件 for file in *.txt; do sed -i.bak -f replace.sed "$file" done # 确认替换无误后,可批量删除备份文件 rm *.bak
单行简化版本
如果不想生成临时的replace.sed文件,可以通过进程替换直接把规则传给sed:
sed -i.bak -f <(awk -F ', ' '{print "s/"$1"/"$2"/g"}' substs.csv) 目标文件
注意事项
因为你已经确认替换规则的执行顺序不影响最终结果,上述方案不需要额外调整规则排序,可以直接使用。如果后续有特殊字符需要匹配,自行调整sed规则的转义逻辑即可。
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

