我使用以下格式返回号码
v0.0.1
所以在这种情况下我需要将数字更改为
v0.0.2
如果我有
v0.0.9
我想将其更改为
v0.1.0
所以拥有...每次增加一个
我尝试的是以下
awk -F. '{$NF+=1; OFS="."; print $0}
哪个不起作用(给出相同的值),可能是什么问题?
我在VERSION=git describe --tags --abbrev=0 | awk -F. '{$NF+=1; OFS="."; print $0}'
之前使用
哪个不起作用......
更新
当我尝试詹姆斯的代码时,我得到的值增加了dots
而没有v
答案 0 :(得分:3)
播放分隔符和记录重建:
$ echo 0.0.9 |
awk '
BEGIN {
FS="." # set the separators
OFS=""
}
{
sub(/^v/,"") # remove the v
$1=$1 # rebuild record to remove periods
$0=sprintf("%03d",$0+1) # zeropad the number after adding 1 to it
}
END {
FS="" # reset the separators
OFS="."
$0=$0 # this to keep the value in $0
$1=$1 # rebuild to get the periods back
print "v" $0 # output
}'
v0.1.0
似乎可以使用9.9.9 - > 1.0.0.0。
答案 1 :(得分:2)
在增加列之前,需要设置OFS
这个小问题。更糟糕的问题是你不处理9(0.0.9-> 0.1.0)的情况:
#!/bin/bash
awk -F. '{OFS=".";
printf("v");
for(i=NF; i>0;i--) {
$i++;
if ($i<10) break;
if(i>1) $i=0;
}
}1'
这可以是一个单行,我只是把它放在脚本中以便于阅读。你会用它:
echo 9.9.9 | myscript.bash
另一个问题是溢出,由if(i>1)
处理。请注意,输入不能包含v
。如果您有bash
VERSION=v1.2.3
,则可以使用${VERSION:1}
轻松获取相关子字符串。
答案 2 :(得分:2)
好吧,在bash函数中,这个怎么样?
$ function incv { printf "%03d\n" $((10#${1//[^0-9]/}+1)) | sed -E 's/(.)(.)(.)/v\1.\2.\3/'; }
$ incv v0.0.9
v0.1.0
$ incv v0.1.5
v0.1.6
这里的想法是:
我们可以单独使用bash中的sed部分,但这将是更多的工作....
我认为唯一奇怪的部分是10#
。其目的是确保将该数字解释为基数10,因为前导0可能会导致bash将该数字视为八进制。哪个对v0.0.9
无效。 :)
答案 3 :(得分:1)
纯 bash ,在@ghoti解决方案
上#!/bin/bash
increase_version(){
local string display c
string=$((10#${1//[^0-9]}+1))
string=$(printf "%03d\n" "$string" )
for (( c=0; c < ${#string}; c++ )); do
display+="${string:$c:1}."
done
echo "v${display::-1}"
}
echo -n "v0.0.1 -> " ; increase_version "v0.0.1"
echo -n "v0.0.9 -> " ; increase_version "v0.0.9"
echo -e "\nbash $BASH_VERSION"
<强>输出强>
v0.0.1 -> v0.0.2
v0.0.9 -> v0.1.0
bash 4.4.18(1)-release
<强>长凳强>
循环10000次迭代:
执行时间不是质量的唯一标准,我将其发布以供参考