如何在bash中的字符串末尾增加数字?

时间:2019-04-17 15:07:53

标签: bash

基本上,我需要创建一个传递参数的函数,并且需要更新数字,例如,参数将是

version_2,并在功能之后将其更改为version_3

仅增加一个

在Java中,我将创建一个新字符串,并抓住最后一个字符更新,然后追加,但不确定如何在bash中执行。

updateVersion() {
  version=$1
}

前缀可以是任何东西,例如,可以是dog12或dog_12,并且总是有一个要更新的数字。

更新后,分别为dog13或dog_13。

4 个答案:

答案 0 :(得分:2)

updateVersion()
{
    [[ $1 =~ ([^0-9]*)([0-9]+) ]] || { echo 'invalid input'; exit; }     
    echo "${BASH_REMATCH[1]}$(( ${BASH_REMATCH[2]} + 1 ))"
}

# Usage
updateVersion version_11         # output: version_12
updateVersion version11          # output: version12
updateVersion something_else123  # output: something_else124
updateVersion "with spaces 99"   # output: with spaces 100

# Putting it in a variable
v2="$(updateVersion version2)"
echo "$v2"                       # output: version3

答案 1 :(得分:2)

incrementTrailingNumber() {
  local prefix number
  if [[ $1 =~ ^(.*[^[:digit:]])([[:digit:]]+)$ ]]; then
    prefix=${BASH_REMATCH[1]}
    number=${BASH_REMATCH[2]}
    printf '%s%s\n' "$prefix" "$(( number + 1 ))"
  else
    printf '%s\n' "$1"
  fi
}

用法:

$ incrementTrailingNumber version_30
version_31
$ incrementTrailingNumber foo-2.15
foo-2.16
$ incrementTrailingNumber noNumberHereAtAll  # demonstrate noop case
noNumberHereAtAll

答案 2 :(得分:2)

使用参数扩展:

#! /bin/bash
shopt -s extglob
for version in version_1 version_19 version_34.14 ; do
    echo $version
    v=${version##*[^0-9]}
    ((++v))
    echo ${version%%+([0-9])}$v
done
extglob构造需要

+([0-9]),意思是“一个或多个数字”。

答案 3 :(得分:0)

在这里晚了聚会,但是接受的答案有问题。它适用于OP在结尾之前没有数字的情况,但是我有一个这样的示例:

1.0.143

为此,正则表达式需要稍微宽松一些。这是我的做法,保留了前导零:

#!/usr/bin/env bash

updateVersion()
{
  [[ ${1} =~ ^(.*[^0-9])?([0-9]+)$ ]]  && \
    [[ ${#BASH_REMATCH[1]} -gt 0 ]] && \
      printf "%s%0${#BASH_REMATCH[2]}d" "${BASH_REMATCH[1]}" "$((10#${BASH_REMATCH[2]} + 1 ))" || \
      printf "%0${#BASH_REMATCH[2]}d" "$((10#${BASH_REMATCH[2]} + 1))" || \
    printf "${1}"
}

# Usage
updateVersion 09          # output 10
updateVersion 1.0.450     # output 1.0.451
updateVersion version_01  # output version_02
updateVersion version12   # output version13
updateVersion version19   # output version20

注意:

  1. 您只需将printf的第一个参数加双引号即可。
  2. 如果要在命令行上使用${1}中的内容替换"", 而不是在函数中。
  3. 如果愿意,可以将最后一个printf切换为基本echo。如果您只是打印到stdoutstderr,请考虑在每个\n的末尾添加换行符(printf)。
  4. 您可以将函数内容合并为一行,但是很难阅读。最好如上所述,在每个if({\)和else(&&)处将其与||对齐。

函数的作用-逐行:

  • 测试传递的值以一个或多个数字结尾,可以选择以至少一个非数字为前缀。相应地分为两组(索引基于1)。
  • 以数字结尾时,请测试是否存在非数字前缀(即组1的长度> 0)。
  • 当包含非数字时,打印组1(字符串),然后打印组2(整数,并用零填充以匹配原始字符串大小)。第2组以10为基数转换并增加1。转换非常重要-默认情况下,前导零被解释为八进制。
  • 如果只有数字,则按上述方法递增,但仅打印组2。
  • 如果输入为其他内容,请返回提供的字符串。