将目录中的最后一个数字加1?

时间:2019-04-18 13:31:58

标签: bash

我想增加具有以下结构的字符串形式传递的目录中的最后一个数字。

将传递的示例字符串是:/efs/etc/alex15_0

函数完成后,它将变为/efs/etc/alex15_1

我要增加的数字始终位于_符号之后,该符号仅出现一次,它可以用作我假定的索引。它将以1递增,没有小数,只有规则的整数。

我尝试使用抓取最后一个字符

${str:$i:1}

但这显然不适用于99变成910的情况

在Java中,我将获取“ _”的索引,然后从该索引中将其子字符串转换为长度并将其递增。

str=/efs/etc/alex15_0
 updateVer()
{
}

3 个答案:

答案 0 :(得分:3)

以下应该可以解决问题:

$ str=/efs/etc/alex15_0
$ echo ${str%_*}_$((${str##*_}+1))
/efs/etc/alex15_1

此方法的工作方式是使用bash的3个功能:

  1. 删除匹配的前缀模式。 ${pattern%word}用于删除最终数字并保留字符串的开头。

      

    单词被扩展以产生模式,就像路径名扩展一样。如果该模式与参数的扩展值的结尾部分匹配,则扩展的结果是具有最短匹配模式(%情况)或最长匹配模式({{1 }}的情况下删除。

  2. 删除匹配的前缀模式: %%用于给出字符之后的最终数字。

      

    单词被扩展以产生模式,就像路径名扩展一样。如果模式与parameter的值的开头匹配,则扩展的结果为             具有最短匹配模式(${parameter##word}情况)或最长匹配模式(#情况)的参数值。

  3. 算术扩展

      

    算术扩展允许对算术表达式进行求值并替换结果。算术扩展的格式为:

    ##

答案 1 :(得分:2)

所有bash都不会扩展全局,以防它对某人有所帮助。

echo ${dir%${dir##*_}}$((${dir##*_}+1))

是的,您可以使用参数扩展作为参数扩展的修饰符。

$: dir=/efs/etc/alex15_0
$: echo ${dir##*_}        # remove everything up to last underscore
0
$: echo ${dir%${dir##*_}} # remove everything *after* "everything after the last underscore"
/efs/etc/alex15_
$: echo $((${dir##*_}+1)) # show everything after last _, +1
1
$: echo ${dir%${dir##*_}}$((${dir##*_}+1)) # stack it all together
/efs/etc/alex15_1

与kvantour的解决方案基本相同,只是使用分层扩展。 :)

答案 2 :(得分:1)

如果您对awk没问题,请尝试以下操作。

echo "$val" | awk 'BEGIN{FS=OFS="_"} {$NF+=1} 1'