不推荐用 sed 修改 XML 文件,仅适用于单行、无嵌套、无属性、无换行的简单标签;例如用 sed -i 's|[^

用 sed 修改 XML 文件中的值,不推荐作为通用方案,但对简单、格式固定、无嵌套的 XML 片段(比如配置文件),可以快速完成。关键在于:XML 是结构化数据,sed 是行文本处理器,它不解析语法,只做字符串替换——稍有不慎就会破坏格式或改错地方。
核心原则:只用于可控、扁平、无属性干扰、无换行的单标签场景。例如:
8080 30 false
✅ 适用场景:单行标签 + 确定标签名 + 纯文本内容
假设要把 `
sed -i 's/[^<]*<\/port>/ 9090<\/port>/' config.xml
[^ 表示“匹配任意非字符”,避免跨标签误吞(比.*更安全)-
-i直接修改原文件(加-i.bak可先备份) - 注意
/作为分隔符时,需对中的/转义(写成\/);也可换用其他分隔符避开:
sed -i 's|[^<]* |9090 |' config.xml
⚠️ 常见陷阱与绕过方法
标签含空格或换行?→ `sed` 默认按行处理,多行 XML 会失效(如 `
\n 8080\n `)-
同一文件多个 `
`?上面命令只改第一个;加 `g` 标志可全局替换: - `s|
[^| 9090 |g`
- `s|
-
标签带属性?比如 `
8080 ` → 正则需适配,但易变脆弱:- `s|
]*>[^| 9090 |g`(仅建议确认属性固定且无引号嵌套时用)
- `s|
内容含特殊字符(如 `&`, ``)?原始 XML 已转义,替换值也要保持转义(如 `&`),否则破坏合法性
? 更稳妥的替代思路(强烈建议)
真正可靠的 XML 修改,应使用专有工具:
-
xmlstar(轻量、命令行友好):
xmlstar -L -O -u "//port" -v "9090" config.xml > tmp && mv tmp config.xml -
xmllint(libxml2 自带,常见于 Linux):
xmllint --shell config.xml (需支持交互模式) - Python + `xml.etree.ElementTree`(适合脚本化、带逻辑判断)
? 小结:什么情况下可以用 sed?
- 你完全控制该 XML 文件格式(人工生成、无注释、无命名空间、无换行缩进)
- 只需改一两个明确标签,且内容不含 `
- 追求极简、临时、一次性操作,不写脚本也不装额外工具
- 已测试过正则在目标内容上准确匹配(先用 `sed -n '/pattern/p'` 预览)
基本上就这些。真要长期维护 XML 配置,别省那几秒——用 xmlstar 或小段 Python,省心又安全。










