怎么用sed命令批量修改XML文件内容 sed正则表达式

19次阅读

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

怎么用sed命令批量修改XML文件内容 sed正则表达式

sed 批量修改 XML 文件内容可行,但需谨慎——XML 是结构化数据,sed 属于行式文本处理工具,不解析语法树,无法可靠处理嵌套、换行、属性顺序、命名空间等复杂情况。若 XML 简单(单行、无嵌套、标签规整),可用 sed 快速替换;否则推荐用 xmlstarxmllintpythonlxml

只改简单 XML 中的固定文本或属性值

适用于:所有标签和属性都在同一行,且目标模式明确、无歧义。

  • 把所有 old 替成 new

sed -i 's|old|new|g' file.xml

  • 修改某个属性值,如把 version="1.0" 改为 version="2.0"

sed -i 's|version="[^"]*"|version="2.0"|g' file.xml

  • 注意:[^"]* 表示“非双引号字符重复零次或多次”,避免跨属性误匹配
  • | 作分隔符可省去转义斜杠,比 / 更清晰

处理含换行的简单标签(需 gnu sed)

标准 sed 每次只读一行,遇到换行的 XML(如 n Hellon)会失效。GNU sed 可用 :a;N;$!ba; 读入全部内容再处理:

sed -i ':a;N;$!ba;s|.*|Updated content|gs' file.xml

  • :a 定义标签 aN 追加下一行到模式空间;$!ba 若非最后一行就跳回 a —— 实现全文载入
  • s///gs 中的 g 全局替换,s 使 . 匹配换行符(GNU sed 特性)
  • ⚠️ 风险:正则 .* 是贪婪匹配,若文件中有多个 ...,可能从第一个开标签匹配到最后一个闭标签

安全替换的实用技巧

减少误伤,提升可控性:

  • 先用 -np 预览匹配结果: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 或结合 findfind . -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

text=ZqhQzanResources