用Bash脚本中的sed替换文件中的版本号。

huangapple go评论72阅读模式
英文:

Replace version number in file with sed in Bash script

问题

在我的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]+\)/${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}/" project.pro

为什么这不起作用?

到目前为止,我要么完全没有匹配,要么出现了一些奇怪的只替换最后一个数字的情况。

英文:

In my project.pro file I have:

DEFINES += VERSION=\\\"1.13.1\\\"

I'd like to replace whatever the current version number is, with a new one in a Bash script:

VERSION_MAJOR=1
VERSION_MINOR=14
VERSION_PATCH=1

sed -i "s/\([0-9]+.[0-9]+.[0-9]+\)/${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}/" project.pro

Why is that not working?

So far I have managed to get either no matches at all or then some weird replace-only-the-last-number substitutions.

答案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 是备份文件的扩展名,以便在替换错误的情况下可以获取原始文件。

英文:

You may use this sed:

sed -i.bak -E "s/[0-9]+\.[0-9]+\.[0-9]+/$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH/" project.pro

Few problems in your attempt:

  • Without extended regex mode (-E), + cannot be used unescaped.
  • dot needs to be escaped in a regex
  • No need to use a capture group and back-reference \1.

PS: .bak is extension of backup file so that you can get original file, in case of a wrong substitution.

huangapple
  • 本文由 发表于 2020年1月7日 02:01:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/59616819.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定