Моим первым выбором было бы разбить первую переменную на 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}")
Приходит ли точка, в которой добавление 1 не должно давать следующий последовательный номер? Вы сказали, что это даты, поэтому, если 33_2016 - это 33-й день 2016 года, тогда +1 - 34_2016, но если вы начали с 366_2016, тогда должен +1 дать 1_2017? –