如何用sed无临时文件原地替换XML中ns3:myID标签内的值?
sed原地替换XML标签内容的解决方案
要实现sed原地替换<ns3:myID>与</ns3:myID>之间的内容且不生成可见临时文件,关键是正确使用sed的原地替换参数,不同系统的sed语法略有差异:
Linux系统(GNU sed)
直接使用-i参数即可完成原地修改,无需额外备份:
# 精准匹配(避免贪婪匹配误改其他内容) sed -i "s/<ns3:myID>[^<]*<\/ns3:myID>/<ns3:myID>${MY_NEW_VALUE}<\/ns3:myID>/" path.xml # 分组写法,逻辑更清晰 sed -i "s/\(<ns3:myID>\)[^<]*\(<\/ns3:myID>\)/\1${MY_NEW_VALUE}\2/" path.xml
macOS/BSD系统
BSD sed要求-i后必须指定备份后缀,若不需要备份,需传入空字符串'':
sed -i '' "s/<ns3:myID>[^<]*<\/ns3:myID>/<ns3:myID>${MY_NEW_VALUE}<\/ns3:myID>/" path.xml
补充说明
- 用
[^<]*代替.*是为了避免正则贪婪匹配,防止同一行内其他带<的标签被误修改 - 你之前的命令生成临时文件,大概率是因为参数写法错误(多余的
-),修正参数后即可实现原地替换
内容的提问来源于stack exchange,提问作者lalala
相关产品推荐
相关产品推荐

