You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本sed正则替换config.xml包名时丢失行内容的问题

解决sed替换时误删整行其他内容的问题

看起来你遇到的核心问题是sed命令的正则过度匹配——虽然在测试工具里正则只选中了目标字符串,但实际执行时却把整行后半段的version、xmlns等内容都替换掉了,这大概率是因为你写的正则用了.*这类会匹配到行尾的表达式,把不该替换的内容也包含进去了。

举个直观的例子,假设你的原行是这样的:

如果你的sed命令写成了:

sed 's/com.FitDegree\..*/com.FitDegree.ThisIsIt/' config.xml

这里的.*会匹配从com.FitDegree.之后到行尾的所有内容,最终整行会变成:

<widget id="com.FitDegree.ThisIsIt

这显然不是你想要的结果。

正确的解决方案

我们需要让正则只匹配com.FitDegree.后面、引号之前的内容(因为id的值是用引号包裹的),用[^"]*来匹配任意非引号的字符,就能精准锁定目标子串,不会影响行内其他属性。

基础版(精准匹配目标子串)

# Linux环境直接用-i原地修改
sed -i 's/com\.FitDegree\.[^"]*/com.FitDegree.ThisIsIt/' config.xml

# macOS环境的sed需要加空参数
sed -i '' 's/com\.FitDegree\.[^"]*/com.FitDegree.ThisIsIt/' config.xml

进阶版(匹配id属性,避免误替换)

如果担心行内其他位置有类似字符串被误替换,可以更精准地匹配id属性的完整片段:

# Linux
sed -i 's/id="com\.FitDegree\.[^"]*"/id="com.FitDegree.ThisIsIt"/' config.xml

# macOS
sed -i '' 's/id="com\.FitDegree\.[^"]*"/id="com.FitDegree.ThisIsIt"/' config.xml

验证建议

在执行原地修改(-i参数)之前,建议先去掉-i运行命令,查看输出是否符合预期:

sed 's/com\.FitDegree\.[^"]*/com.FitDegree.ThisIsIt/' config.xml

确认只替换了目标字符串,其他内容(version、xmlns等)都保留后,再加上-i修改原文件。

内容的提问来源于stack exchange,提问作者DanielRead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:21:31