繁体   English   中英

更改变量中的数字

[英]Change a Number inside a Variable

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

variable1 = 33_2016

现在我以某种方式想要自动设置第二个变量,该变量设置我得到的“ 33” +1

variable2 = 34_2016

感谢您的任何建议。

我的第一选择是将第一个变量与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}")

您可以使用awk

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

尽管这需要一个外部程序来生成(速度较慢),但读取/写入更容易。 在这里自己决定什么对您更重要。

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

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

您可以使用带子串替换的 参数扩展来做一些相同的事情,例如

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

这是六比一, 半打到另一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM