我想知道如何使用bash来修改版本号中的最后一位数字.
例如
VERSION=1.9.0.9
NEXT_VERSION=1.9.0.10
Run Code Online (Sandbox Code Playgroud)
编辑:版本号仅包含自然数.
该解决方案是否可以通用,以处理版本号中的任意数量的部件.
例如
1.2
1.2.3
1.2.3.4
1.2.3.4.5
Run Code Online (Sandbox Code Playgroud)
让我们从迈克尔的基本答案开始:
VERSIONS="
1.2.3.4.4
1.2.3.4.5.6.7.7
1.9.9
1.9.0.9
"
for VERSION in $VERSIONS; do
echo $VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g'
done
Run Code Online (Sandbox Code Playgroud)
我们怎样才能改善这一点?以下是从大量评论中提取的一堆想法.
程序中的尾部"1"对其操作至关重要,但它不是最明确的做事方式.最后的奇数'1'是一个布尔值,它是真的,因此匹配每一行并触发默认操作(因为后面的括号内没有动作),即打印$ 0,行读取,修改为上一个命令.
因此,为什么不使用这个awk命令来避免sed命令呢?
awk -F. '{$NF+=1; OFS="."; print $0}'
Run Code Online (Sandbox Code Playgroud)
当然,我们可以在几个阶段进一步改进.您可以使用bash'<<<'字符串重定向运算符来避免管道:
awk -F. '...' <<< $VERSION
Run Code Online (Sandbox Code Playgroud)
接下来的观察是,给定一系列行,awk的单个执行可以处理它们:
echo "$VERSIONS" | awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}'
Run Code Online (Sandbox Code Playgroud)
没有for循环."$ VERSION"周围的双引号保留字符串中的换行符.管道仍然是不必要的,导致:
awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}' <<< "$VERSIONS"
Run Code Online (Sandbox Code Playgroud)
正则表达式$VERSION通过仅处理包含数字后跟点的行来忽略空行.当然,在每行中设置OFS有点笨拙,并且' +=1'可以缩写' ++',所以你可以使用:
awk -F. '/[0-9]+\./{$NF++;print}' OFS=. <<< "$VERSIONS"
Run Code Online (Sandbox Code Playgroud)
(或者你可以BEGIN{OFS="."}在程序中加入' ',但这相当冗长.
' <<<'表示法仅由Bash支持,而不是由Korn,Bourne或其他POSIX shell支持(除非作为与Bash表示法并行的非标准扩展名).AWK程序将受到awk你可能能够掌握的任何版本的支持(但旧的UNIX 7th Edition AWK不支持命令行上的变量赋值).
我想出了这个。
VERSIONS="
1.2.3.4.4
1.2.3.4.5.6.7.7
1.9.9
1.9.0.9
"
for VERSION in $VERSIONS; do
echo $VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g'
done
Run Code Online (Sandbox Code Playgroud)