增加某个文件中的版本并提交回git

时间:2017-03-03 23:23:33

标签: git awk sed

enter image description here

我有两个index.html文件,其中包含rev=a=0.1bust=b=0.1等属性。

在第一个文件中,我想将rev=a增加+1,从而产生0.2。在第二个文件中,我想将rev=abust=b增加+1,从而产生0.2。这个增量应该通过只增加数字而不是任何其他代码而不是引用来增加每个构建,并提交回git。

我听说可以使用sed和awk命令。有人可以帮我一下这些命令吗?

我已经在Jenkins中通过构建步骤shell与Git集成了这些命令。 Git有这些文件。

sed -r -i 's/(.*)(\?rev=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' src/main/webapp/index.html
sed -r -i 's/(.*)(\?bust=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' src/main/webapp/index.html
sed -r -i 's/(.*)(\?rev=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' src/main/webapp/common/index.html

git status
git add -A
git commit -am 'Updated Version Number for next build to $NEW_VERSION'
git push origin HEAD:origin

但是,例如,如果revbust15.06,则此命令会将其增加到16.06而不是15.07。此外,它正在剥离该行的"引号。

我可以让它为每个构建提交。 我想在这里只尝试shell命令!!!

请查看更新的命令和结果

2 个答案:

答案 0 :(得分:1)

awk救援!

如果输入测试文件

没有递增0.1
rev=a=0.1
bust=b=13.1
other lines

运行

awk 'BEGIN{FS=OFS="="} $1~/^(rev|bust)$/{$NF+=0.1}1' file

将给出

rev=a=0.2
bust=b=13.2
other lines

或者,对于输入文件

,或许您希望将小数点后的值递增1
rev=a=0.1
bust=b=13.1
other lines
rev=a=1.9
bust=b=13.99

正在运行

$ awk 'BEGIN{FS=OFS="."} $1~/^(rev=a=|bust=b=)/{$NF+=1}1' file

将生成

rev=a=0.2
bust=b=13.2
other lines
rev=a=1.10
bust=b=13.100

答案 1 :(得分:0)

你不符合你的想法

您的sed表达式与您要匹配的内容不符。

您想要将?rev=14.06更改为?rev=14.07。但你根本就没有抓住它。你的比赛目前正是这样的。

s/(.*)(\?rev=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge
       ^       ^       ^
       |       |       |
       |       |       +-- here you start matching ".06" -- [\4]
       |       +---------- here you match the "14" -------- [\3]
       +------------------ here you match the "?rev=" ----- [\2]

如上所示,您可以按预期匹配?rev=。但接下来,您只匹配 数字14。这是因为您忘记将.作为匹配类的一部分。最后,通配符提取.*匹配.06以及随后的所有内容。

因此,当您在\3匹配中添加1时,它会从14增加到15.然后再增加到16,17,依此类推。

即使您符合您的想法,也就是说,如果您将14.06\3匹配,则添加1将不会移至14.07,它将是{ {1}}。如果sed甚至支持浮点数学,那我就不确定了。

你可能想要这样的东西:

15.07

现在,当您为s/(.*)(\?(rev|bust)=[0-9]+\.)([0-9]+)(.*)/echo "\1\2$((\4+1))\5"/ge ^ ^ | | | +----- this matches "06" -- [\4] +--------------------- this matches "?rev=14." --- [\2] 匹配添加1时,您只匹配小数点后的数字部分。因此,从\4开始,您将获得67,等等。

在这种情况下,它与8匹配,但这应该与将14.06转换为13.1相同,依此类推。

所以你的命令将是:

13.2

有一个领先的零点将会被删除

这或多或少具有美感,但请注意,如果你匹配" 14.06"如你的例子所示,这将变成" 14.7"如果您使用sed -r -i 's/(.*)(\?(rev|bust)=[0-9]+\.)([0-9]+)(.*)/echo "\1\2$((\4+1))\5"/ge' {filename} 数学和$(( ))命令。

使用echo正在删除引号

sed命令中的替换部分正在使用echo来创建新文本。当你用双引号传入它时,它会变得混乱。你最终运行的命令是这样的。

echo "..."

如果你看一下引号的位置,就像运行这个:

echo "<script type="text/javascript" src="scripts/constants.js?rev=14.7"></script>"

使用Linux printf "<script type=" printf "text/javascript" printf " src=" printf "scripts/constants.js?rev=14.7" echo "></script>" ,输出如下:

/bin/sh

老实说,你很幸运,因为它没有<script type=text/javascript src=scripts/constants.js?rev=14.7></script> <在引号之外,或者你发生了重定向错误。

要解决此问题,您只需在HTML文件中使用单引号即可。然后,不会将双引号传递给>命令,echo不应该删除引号。

sed

现在,外部双引号将正确包装所有内容,并且HTML中的单引号将被保留。