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

Increment by 1 the last number in a directory?

提问人:DDisciple 提问时间:4/18/2019 最后编辑:kvantourDDisciple 更新时间:4/19/2019 访问量:188

问:

我想使用以下结构递增作为字符串传递的目录中的最后一个数字。

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

功能完成后,它将成为/efs/etc/alex15_1

我想增加的数字总是在只出现一次的符号之后,我想它可以用作索引。它将以 1 递增,没有小数,只有常规整数。_

我尝试使用

${str:$i:1}

但这显然不适用于像 99 这样的情况,它会变成 910

在 Java 中,我会抓取“_”的索引,然后从该索引中将字符串子字符串设置为长度并递增它。

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

评论


答:

3赞 kvantour 4/18/2019 #1

以下应该可以解决问题:

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

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

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

    该单词被扩展以产生一种模式,就像在路径名扩展中一样。如果模式与参数扩展值的尾部匹配,则扩展的结果是参数的扩展值,其中删除了最短匹配模式(大小写)或最长的匹配模式(大小写)。%%%

  2. 删除匹配的前缀模式: 这用于给出<下划线>字符之后的最终数字。${parameter##word}

    该单词被扩展以产生一种模式,就像在路径名扩展中一样。如果模式与参数值的开头匹配,则扩展的结果为展开 删除了最短匹配模式(大小写)或最长匹配模式(大小写)的参数值。###

  3. 算术扩展

    算术扩展允许计算算术表达式和替换结果。算术扩展的格式为:

    $((expression))
    

评论

0赞 kvantour 4/18/2019
@DDisciple 我对多位数数字进行了一个小更新
1赞 RavinderSingh13 4/18/2019 #2

如果您同意,请尝试以下操作。awk

echo "$val" | awk 'BEGIN{FS=OFS="_"} {$NF+=1} 1'
2赞 Paul Hodges 4/18/2019 #3

所有 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的解决方案基本相同,只是玩分层扩展。:)