我有这个字符串"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