如何使用bash来修改版本号

fro*_*301 6 bash replace

我想知道如何使用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)

Jon*_*ler 9

让我们从迈克尔的基本答案开始:

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不支持命令行上的变量赋值).


fro*_*301 5

我想出了这个。

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)

  • @Jonathan:结尾的1是一个布尔值,强制执行默认操作`print`。它与仅选择输入的第一行的前导1不同。为了增加,`$ NF ++`也可以。您只需要设置一次输出定界符。结果:`awk -F。'{$ NF ++} 1'OFS = .`或`awk -F。'1 {$ NF ++} 1'OFS = .`。我更喜欢显式打印而不是隐式打印,但是`$ 0`不是必需的:`awk -F。'{$ NF ++; 打印}'OFS = .`。也可以使用-v参数或在BEGIN子句中设置OFS。我看到您说了我输入过程中的几件事。 (2认同)