【问题标题】:Change a Number inside a Variable更改变量内的数字
【发布时间】:2016-12-23 00:35:55
【问题描述】:

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

变量1=33_2016

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

变量2=34_2016

感谢您的建议。

【问题讨论】:

  • 加 1 是否会产生下一个连续数字?你说这些是日期,所以如果 33_2016 是 2016 年的第 33 天,那么 +1 就是 34_2016,但是如果你从 366_2016 开始,那么 +1 应该会产生 1_2017 吗?

标签: bash variables sed


【解决方案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}")

【讨论】:

    【解决方案2】:

    你可以使用awk:

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

    虽然这需要一个外部进程来生成(有点慢),但它更容易读/写。在这里你自己决定什么对你更重要。

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

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

    【讨论】:

      【解决方案3】:

      你可以用参数扩展子字符串替换做同样的事情,例如

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

      一个是 六个,另一个是 六个

      【讨论】:

        猜你喜欢
        • 2013-04-02
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        相关资源
        最近更新 更多