sed可批量修改简单XML(单行、无嵌套),但不解析结构,复杂场景应使用xmlstar等专业工具。
用 sed 批量修改 XML 文件内容可行,但需谨慎——XML 是结构化数据,sed 属于行式文本处理工具,不解析语法树,无法可靠处理嵌套、换行、属性顺序、命名空间等复杂情况。若 XML 简单(单行、无嵌套、标签规整),可用 sed 快速替换;否则推荐用 xmlstar、xmllint 或 Python 的 lxml。
适用于:所有标签和属性都在同一行,且目标模式明确、无歧义。
old 替成 new :sed -i 's|
version="1.0" 改为 version="2.0":sed -i 's|version="[^"]*"|version="2.0"|g' file.xml
[^"]* 表示“非双引号字符重复零次或多次”,避免跨属性误匹配| 作分隔符可省去转义斜杠,比 / 更清晰标准 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' {} +
以下情况请立刻停手,改用专业 XML 工具:
或处理指令
在 和 内),需上下文感知desc="He said "Hi"")
L 是否仍格式良好(well-formed)例如,用 xmlstar 安全更新属性:xmlstar -O -L -S -u '//book/@isbn' -v "978-0-123456-78-9" books.xml