Самое замечательное, ваш вклад очень регулярный. Таким образом, используя регулярное выражение, как
^i([0-9]+)(\..*)$
будет начинаться с начала ввода, соответствовать 'i' как необходимому символу, затем соответствовать десятичному числу, а затем совпадать с остальной частью ввода до конца.
Скобки делают группы доступными для захвата совпадений. Если вы используете bash, группы захвата доступны в BASH_REMATCH
(массив). С этим регулярным выражением у вас есть две группы захвата: цифры, которые вы хотите уменьшить, и остальная часть имени файла.
Чтобы создать новое имя файла, вы хотите объединить символы 'i', ${BASH_REMATCH[1]} - 1
и ${BASH_REMATCH[2]}
.
Если вы не согласны с bash, возможно, попробуйте perl
? (Кроме того, вы могли бы использовать \d
для цифр, особенно моего фаворита.) Он немного тяжелее на процессоре, чем sed
или awk
, но гораздо проще для того, что вы пытаетесь сделать.
sed
поддерживает обратные ссылки, но для их арифметики вам придется вызывать команду оболочки из выражения sed
(выполнимо). awk
на самом деле не поддерживает обратные ссылки, но gawk имеет функцию, чтобы помочь, gensub
.