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
相关产品推荐
相关产品推荐

