如何替换XML文件中pkg-ref行的版本号?
如何正确替换XML中pkg-ref标签的版本号
我之前碰到过类似的坑,先帮你分析问题出在哪,再给你靠谱的解决方案:
先看你的XML示例内容:
#foo1.pkg #foo2.pkg
你写的sed脚本问题出在正则表达式上:version=\"*.*.*\"里的*是正则的量词(匹配前面字符0次或多次),不是你以为的通配符。这个表达式会错误匹配version="后面的内容,甚至跨字符匹配到双引号之外,导致删掉不该删的部分。
给你两个可行的解决方案:
方案1:精准匹配三段式数字版本号
如果你的版本号都是x.y.z这种数字三段式格式,用这个脚本最精准:
#!/bin/sh NEW_VERSION="1.2.0" # Linux系统使用该写法 sed -i "s/version=\"[0-9]*\.[0-9]*\.[0-9]*\"/version=\"$NEW_VERSION\"/" foo.xml # macOS系统需要调整-i参数的写法 # sed -i '' "s/version=\"[0-9]*\.[0-9]*\.[0-9]*\"/version=\"$NEW_VERSION\"/" foo.xml
这里[0-9]*\.[0-9]*\.[0-9]*专门匹配数字+点组成的三段式版本号,不会误触其他内容。
方案2:通用匹配任意格式版本号
如果你的版本号可能有其他格式(比如带预发布标签1.2.0-beta,或者多段号1.2.0.1),用这个更通用的写法:
#!/bin/sh NEW_VERSION="1.2.0" # Linux系统使用该写法 sed -i "s/version=\"[^\"]*\"/version=\"$NEW_VERSION\"/" foo.xml # macOS系统需要调整-i参数的写法 # sed -i '' "s/version=\"[^\"]*\"/version=\"$NEW_VERSION\"/" foo.xml
[^\"]*表示匹配所有不是双引号的字符,不管版本号是什么内容,只要在version="和下一个"之间,都会被精准替换,完全不会误删其他内容。
另外提个小细节:你原来脚本里的-ie其实是把备份文件的后缀设成了e,如果不需要备份原文件,直接用-i(Linux)或者-i ''(macOS)就好。
内容的提问来源于stack exchange,提问作者pizzafilms
相关产品推荐
相关产品推荐

