用 Bash 脚本中的 sed 替换文件中的版本号
Posted
技术标签:
【中文标题】用 Bash 脚本中的 sed 替换文件中的版本号【英文标题】:Replace version number in file with sed in Bash script 【发布时间】:2020-04-24 06:36:25 【问题描述】:在我的project.pro
文件中,我有:
DEFINES += VERSION=\\\"1.13.1\\\"
我想用 Bash 脚本中的新版本号替换当前版本号:
VERSION_MAJOR=1
VERSION_MINOR=14
VERSION_PATCH=1
sed -i "s/\([0-9]+.[0-9]+.[0-9]+\)/\1$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH/" project.pro
为什么这不起作用?
到目前为止,我已经设法要么根本没有匹配到,要么得到一些奇怪的 replace-only-the-last-number 替换。
【问题讨论】:
这里为什么需要\\\? 这是一些 Qt 项目文件垃圾,以便将值作为字符串正确传递给编译器。编译器必须得到-DVERSION=\"1.13.1\"
。
【参考方案1】:
你可以使用这个sed
:
sed -i.bak -E "s/[0-9]+\.[0-9]+\.[0-9]+/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH/" project.pro
您的尝试中很少遇到问题:
如果没有扩展正则表达式模式 (-E
),+
不能不转义使用。
点需要在正则表达式中转义
无需使用捕获组和反向引用\1
。
PS:.bak
是备份文件的扩展名,这样你可以得到原文件,以防替换错误。
【讨论】:
.bak
是什么?它是否存在并不重要。
在回答中添加了关于.bak
的注释。以上是关于用 Bash 脚本中的 sed 替换文件中的版本号的主要内容,如果未能解决你的问题,请参考以下文章
Bash 脚本:如何用 sed 替换 package.json 中的文本