我想知道如何使用bash修改版本号的最后一位。
例如
VERSION=1.9.0.9
NEXT_VERSION=1.9.0.10
编辑:版本号将只包含自然数。
解决方案是否可以通用,以处理版本号中的任何数量的部件。
例如
1.2
1.2.3
1.2.3.4
1.2.3.4.5
最佳答案
让我们从answer的基本froogz3301开始:
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
我们如何对此进行改进?这里是从大量评论中提炼出来的一堆想法。
程序中的尾随“1”对其操作至关重要,但这并不是最明确的处理方式。最后的奇数“1”是一个 bool 值,它为true,因此匹配每行并触发默认操作(由于括号后没有任何操作),该操作将打印$ 0,即读取的行,由修改上一个命令。
因此,为什么不删除
awk
命令的sed
命令呢?awk -F. '{$NF+=1; OFS="."; print $0}'
当然,我们可以在几个阶段中进一步完善这些内容。您可以使用bash'<<
awk -F. '...' <<< $VERSION
下一个观察结果是,给定一系列行,一次执行awk可以处理所有这些行:
echo "$VERSIONS" | awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}'
没有for循环。 “$ VERSION”周围的双引号将字符串中的换行符保留。管道仍然是不必要的,从而导致:
awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}' <<< "$VERSIONS"
正则表达式仅通过处理包含数字后跟点的行来忽略
$VERSION
中的空行。当然,在每行中设置OFS有点笨拙,并且'+=1
'可以缩写为'++
',因此您可以使用:awk -F. '/[0-9]+\./{$NF++;print}' OFS=. <<< "$VERSIONS"
(或者您可以在程序中包含“
BEGIN{OFS="."}
”,但这很冗长。Bash仅支持'
<<<
'表示法,而不是Korn,Bourne或其他POSIX Shell支持(除非是与Bash表示法平行的非标准扩展名)。您可能会喜欢的任何版本的awk
都将支持AWK程序(但旧的UNIX 7th Edition AWK不支持命令行上的变量分配)。关于bash - 如何使用bash修改版本号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4485399/