Заменить подстроку после второго появления символа bash - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть эта строка "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 голосов
/ 08 февраля 2019

С прочитанным и наследственным:

str="foo1.0_1.17"
while IFS='.' read a b c
  do
    echo $a"."$b"."$((c+1))
  done <<EOF
$str
EOF
0 голосов
/ 08 февраля 2019

Вы также можете использовать 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
0 голосов
/ 08 февраля 2019

Вы также можете использовать этот метод, который является модификацией вашего кода

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
0 голосов
/ 08 февраля 2019

Используя awk, вы можете использовать точку в качестве разделителя и увеличить 3-е поле:

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

foo1.0_1.1

...