在第二次出现字符 bash 后替换子字符串



我有这个字符串"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##*.}的结果作为模式。

如何实现这一点?更一般地说,如何在某个字符第二次出现(在本例中为点(后替换子字符串?

使用awk可以使用点作为分隔符并递增第 3 个字段:

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

foo1.0_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

你也可以使用这种方法,它是对代码的修改

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

with read and a heredoc :

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

最新更新