用 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 替换文件中的版本号的主要内容,如果未能解决你的问题,请参考以下文章

sed 用 Bash 变量替换

Bash 脚本:如何用 sed 替换 package.json 中的文本

用脚本中的 sed 将行替换为文件的内容

用文件的内容替换某些标记(使用 bash 脚本)

如何查找多个文件、检查重复文件并用 bash、sed 脚本替换

使用sed用多行替换一个单词?