sed可批量修改简单XML(单行、无嵌套),但不解析结构,复杂场景应使用xmlstar等专业工具。

用 sed 批量修改 XML 文件内容可行,但需谨慎——XML 是结构化数据,sed 属于行式文本处理工具,不解析语法树,无法可靠处理嵌套、换行、属性顺序、命名空间等复杂情况。若 XML 简单(单行、无嵌套、标签规整),可用 sed 快速替换;否则推荐用 xmlstar、xmllint 或 Python 的 lxml。
只改简单 XML 中的固定文本或属性值
适用于:所有标签和属性都在同一行,且目标模式明确、无歧义。
- 把所有
替成old :new
sed -i 's|
- 修改某个属性值,如把
version="1.0"改为version="2.0":
sed -i 's|version="[^"]*"|version="2.0"|g' file.xml
- 注意:
[^"]*表示“非双引号字符重复零次或多次”,避免跨属性误匹配 - 用
|作分隔符可省去转义斜杠,比/更清晰
处理含换行的简单标签(需 GNU sed)
标准 sed 每次只读一行,遇到换行的 XML(如 )会失效。GNU sed 可用 :a;N;$!ba; 读入全部内容再处理:
sed -i ':a;N;$!ba;s|
-
:a定义标签a;N追加下一行到模式空间;$!ba若非最后一行就跳回a—— 实现全文载入 -
s///gs中的g全局替换,s使.匹配换行符(GNU sed 特性) - ⚠️ 风险:正则
.*是贪婪匹配,若文件中有多个,可能从第一个开标签匹配到最后一个闭标签...
安全替换的实用技巧
减少误伤,提升可控性:
- 先用
-n和p预览匹配结果:sed -n '//p' file.xml - 用
\b锚定单词边界,避免替错类似字段:sed 's/\bstatus="up"\b/status="down"/' - 对路径中含特殊字符的文件,用
--分隔选项与文件名:sed -i 's/old/new/g' -- 'file with space.xml' - 批量处理多个文件:
sed -i 's/foo/bar/g' *.xml或结合find:find . -name "*.xml" -exec sed -i 's/old/new/g' {} +
什么时候坚决别用 sed
以下情况请立刻停手,改用专业 XML 工具:
- XML 含 CDATA 段、注释
或处理指令 - 相同标签名在不同层级出现(如
在和内),需上下文感知 - 属性值含双引号、单引号、转义字符(如
desc="He said "Hi"") - 需要验证修改后 XML 是否仍格式良好(well-formed)
例如,用 xmlstar 安全更新属性:xmlstar -O -L -S -u '//book/@isbn' -v "978-0-123456-78-9" books.xml










