批量修改XML文件:在<filename>后插入<path>节点的技术问询
批量修改XML文件:插入带文件名的标签
我来帮你搞定这个批量修改XML的问题!你的思路方向是对的,但确实卡在了提取
方法一:用sed实现(贴近你的初始思路)
这个方案先提取每个XML里的文件名,再精准插入带缩进的<path>标签:
for file in "$PWD"/*.xml; do # 提取<filename>标签内的文件名 filename=$(sed -n 's/.*<filename>\(.*\)<\/filename>.*/\1/p' "$file") # 在<filename>行后追加带缩进的<path>内容 sed -i "/<filename>$filename<\/filename>/a \ <path>/home/red/MyDataset/$filename</path>" "$file" done
关键说明:
- 第一行sed用捕获组
\(.*\)提取<filename>和</filename>之间的内容,存到变量filename中 - 第二行用
sed的a命令(追加),\后面的四个空格就是XML需要的缩进,确保格式和原文件一致 - 用双引号包裹变量,避免文件名含空格、特殊字符时出错
方法二:用awk实现(更稳定处理XML结构)
如果你的XML存在标签换行、格式不规整的情况,awk的处理会更灵活:
for file in "$PWD"/*.xml; do awk ' /<filename>/ { # 移除<filename>和</filename>标签,提取纯文件名 sub(/<filename>/, "", $0) sub(/<\/filename>/, "", $0) filename = $0 # 先输出原<filename>行 print "<filename>" filename "</filename>" # 输出带缩进的<path>行 print " <path>/home/red/MyDataset/" filename "</path>" next } # 其他行原样输出 {print} ' "$file" > temp.xml && mv temp.xml "$file" done
关键说明:
- 匹配到
<filename>行时,先清理标签提取文件名,再依次输出原行和新的<path>行 - 用临时文件中转输出(awk不支持原地修改),最后替换原文件
- 对XML格式的兼容性更强,即使标签前后有多余空格也能正常提取
注意事项
- 先拿单个XML文件测试脚本,确认效果后再批量执行,避免误改所有文件
- 如果你的XML中
<filename>标签不是单独一行,需要微调正则表达式适配格式 - 若文件名包含特殊字符(如
&、空格),优先选择awk方案,稳定性更高
内容的提问来源于stack exchange,提问作者abhimanyuaryan
相关产品推荐
相关产品推荐

