Оболочка bash
поддерживает собственный оператор регулярных выражений, который можно включить с флагом ~
. Все, что вам нужно сделать, это определить регулярное выражение, взять захваченные группы и заменить их измененными значениями
str='a1b2c3'
re='^.*([0-9]+).*([0-9]+).*([0-9]+).*$'
if [[ $str =~ $re ]]; then
for match in "${BASH_REMATCH[@]}"; do
final="${str/$match/$((match*match+1))}"
done
fi
printf '%s\n' "$final"
[[ $str =~ $re ]]
сопоставляет регулярное выражение и обновляет массив захваченных групп ${BASH_REMATCH[@]}
. Поэтому для каждого элемента в порядке их появления мы делаем оператор подстановки строки ${str/old/new}
. Значение замены в вашем случае - это число, умноженное на себя и добавленное на 1.
Добавление дополнительных групп захвата в регулярное выражение .*([0-9]+)
для последующих совпадений.
Если бы не чистое решение bash
, описанное выше, используя внешнюю утилиту, такую как perl
, можно было бы сделать это как
perl -pe 's/\d+/$&*$&+1/ge' <<<"$str"
$&
относится к захваченной цифре в строке, а флаг e
позволяет выполнять арифметические операции над захваченными группами.