更改变量内的数字

时间:2016-08-16 14:57:02

标签: bash variables sed

我有以下问题:(关于日期) 用户将设置以下变量。

  

变量1 = 33_2016

现在我想以某种方式想要自动设置第二个变量来设置" 33" +1 我得到了

  

变量= 34_2016

感谢您的任何建议。

3 个答案:

答案 0 :(得分:1)

我的第一选择是用read分开第一个变量,然后将(更新的)部分重新组合在一起。

IFS=_ read f1 f2 <<< "$variable1"
# Option 1
variable2=$((f1 + 1))_$f2
# Option 2
printf -v variable2 '%s_%s" "$((f1 + 1))" "$f2"

您还可以使用参数扩展来进行解析:

f1=${variable%_*}
f2=${variable#*_}

您还可以使用正则表达式,这种表达式在解析时更具可读性,但更长时间才能将这些部分重新组合在一起(BASH_REMATCH可以使用更短的同义词)。

[[ $variable1 =~ (.*)_(.*) ]] && 
  f1=$((${BASH_REMATCH[1]}+1)) f2=${BASH_REMATCH[2]}

第一个和第三个选项也允许使用数组:

# With read -a
IFS=_ read -a f <<< "$variable1"
variable2=$(IFS=_; echo "${f[*]}")

# With regular expression
[[ $variable1 =~ (.*)_(.*) ]]
variable2=$(IFS=_; echo "${BASH_REMATCH[*]:1:2}")

答案 1 :(得分:0)

您可以使用awk

awk 'BEGIN{FS=OFS="_"}{$1+=1}1' <<< "${variable1}"

虽然这需要一个外部进程来生成(稍微慢一些),但它更容易读/写。在这里确定对你来说更重要的事情。

要将返回值存储在变量中,请使用命令替换:

variable2=$(awk 'BEGIN{FS=OFS="_"}{$1+=1}1' <<< "${variable1}")

答案 2 :(得分:0)

使用子串替换进行参数扩展可以做同样的事情,例如

$ v1=33_2016
$ v2=${v1/${v1%_*}/$((${v1%_*}+1))}
$ echo $v2
34_2016

一个,六个到另一个