如何使用awk根据strings.txt映射关系批量替换多个XML文件中的对应字符串
替换功能实现脚本
awk -i inplace ' # 读取strings.txt构建替换映射表 NR == FNR { # 仅处理存在两个字段的有效行,跳过空行 if (NF == 2) { map[$1] = $2 } next } # 处理所有XML文件 { # 遍历映射表,替换当前行所有匹配的字符串 for (old_str in map) { gsub(old_str, map[old_str]) } # 输出处理后的行 print }' strings.txt *.xml
代码说明
- 执行逻辑分为两个阶段:第一阶段仅处理第一个输入文件
strings.txt,将每行第一个字符串作为查找键,第二个字符串作为替换值存入映射表,自动跳过空行避免报错 - 第二阶段处理所有传入的XML文件,逐行扫描替换所有匹配到的字符串,
gsub会替换一行内所有匹配的内容,如果你只需要替换每行第一个匹配项,把gsub改成sub即可 -i inplace参数会直接修改原XML文件,如果你需要保留原文件备份,可以把参数改成-i inplace=.bak,执行后会自动生成原文件的.bak后缀备份- 末尾的
*.xml会匹配当前目录下所有XML文件,你也可以手动指定需要处理的XML文件名,例如File1.xml File2.xml File3.xml
特殊场景适配:如果
strings.txt第一列的字符串包含正则特殊字符(如.、*、+、$等),上述正则匹配可能出现预期外的结果,此时可以把XML处理阶段的替换逻辑改成纯文本匹配版本:{ for (old_str in map) { new_str = map[old_str] len_old = length(old_str) # 循环替换当前行所有匹配的纯文本内容 while (pos = index($0, old_str)) { $0 = substr($0, 1, pos - 1) new_str substr($0, pos + len_old) } } print }
内容的提问来源于stack exchange,提问作者mbur_1
相关产品推荐
相关产品推荐

