第二次出现字符重击后替换子字符串

时间:2019-02-08 08:29:17

标签: linux string bash replace substring

我有这个字符串“ foo1.0_1.0”,我想根据第二个“。”后面的数字加1,该数字可以超过一位。

这是我的尝试:

str="foo1.0_1.0"
version="${str##*.}"                 # gives 0
new_version="$((version + 1))"       # gives 1

echo "${str/${str##*.}/$new_version}"    # gives foo1.1_1.0 (desired: foo1.0_1.1)

因为它将${str##*.}的结果作为模式。

如何实现?更一般而言,如何在第二次出现某个字符(在这种情况下为点)后替换子字符串?

4 个答案:

答案 0 :(得分:1)

使用awk可以将点用作定界符并增加第三个字段:

awk 'BEGIN{FS=OFS="."} {$3++} 1' <<< "$str"

  

foo1.0_1.1

答案 1 :(得分:1)

您也可以像这样使用sed

#!/bin/bash
str=foo1.0_1.0
header=$(echo $str | sed -n 's/\(.*\.\)[0-9]*/\1/p')
ending=$(echo $str | sed -n 's/.*\.\([0-9]\)/\1/p')
ending=$((ending + 1))
echo $header$ending

答案 2 :(得分:1)

您还可以使用此方法,它是对代码的修改

str="foo1.0_1.0"
version="${str##*.}"                 # gives 0
new_version="$((version + 1))"       # gives 1
echo "${str%${version}}${new_version}"
# gives foo1.0_1.1

答案 3 :(得分:1)

具有阅读权限和heredoc:

str="foo1.0_1.17"
while IFS='.' read a b c
  do
    echo $a"."$b"."$((c+1))
  done <<EOF
$str
EOF