英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论