使用sed命令修改XML文件中的值,本质是利用流编辑器对文本进行模式匹配与替换。由于XML是纯文本格式,只要节点结构相对固定,就可以用sed快速完成批量变更,而不必借助专门的XML解析库。

为什么选择sed处理XML
sed是绝大多数Linux发行版预装的工具,无需额外安装。对于结构简单的XML配置文件,用sed做定点替换比写Python或Java解析程序更轻量,也更容易写进Shell脚本里自动执行。
基本替换语法
sed修改文件内容最常用的形式是替换命令,结构如下:
# 将xml中<port>8080</port>改为<port>9090</port> sed -i 's/<port>.*</port>/<port>9090</port>/' config.xml
上面命令中 s/原模式/新内容/ 是替换语法,-i 表示直接修改原文件。注意XML中的 < 和 > 在sed表达式里要当作普通字符处理,斜杠需要转义为 /。
修改带属性的节点值
如果节点带有属性,例如下面的配置:
<server name="web"> <host>127.0.0.1</host> </server>
要把 host 的值改成 192.168.0.1,可以用如下sed命令:
sed -i 's/<host>.*</host>/<host>192.168.0.1</host>/' config.xml
使用分组保留结构
当开始标签带动态属性时,可以用正则分组来保留原样,只换中间文本:
# 保留<value ...>中的属性,只改内部内容 sed -i 's/(<value[^>]*>).*(</value>)/1new_data2/' data.xml
其中 (...) 定义分组,1 和 2 在替换部分引用,[^>]* 匹配除 > 外的任意字符,也就是属性部分。
注意事项
- sed按行处理,若XML节点跨多行,简单替换会失效,需要先用
tr删除换行或改用其他工具。 - 对格式复杂或带命名空间的XML,建议用 xmllint 或专门解析库,避免误改。
- 执行前最好备份原文件,例如
cp config.xml config.xml.bak。
sed适合做简单、规则的XML文本替换,理解正则与转义规则就能安全高效地完成修改任务。