Давайте начнем с основного ответа Майкла:
VERSIONS="
1.2.3.4.4
1.2.3.4.5.6.7.7
1.9.9
1.9.0.9
"
for VERSION in $VERSIONS; do
echo $VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g'
done
Как мы можем улучшить это? Вот несколько идей, извлеченных из обильного набора комментариев.
Конечный «1» в программе имеет решающее значение для ее работы, но это не самый явный способ сделать что-либо. Нечетное '1' в конце является логическим значением, которое имеет значение true, и поэтому соответствует каждой строке и запускает действие по умолчанию (так как после него нет фигурных скобок), которое должно вывести $ 0, строку читать, как исправлено предыдущая команда.
Следовательно, почему не эта команда awk
, которая отменяет команду sed
?
awk -F. '{$NF+=1; OFS="."; print $0}'
Конечно, мы могли бы уточнить вещи дальше - в несколько этапов. Вы можете использовать оператор перенаправления строк «<<<», чтобы избежать конвейера: </p>
awk -F. '...' <<< $VERSION
Следующим наблюдением будет то, что при наличии ряда строк одно выполнение awk может их обработать:
echo "$VERSIONS" | awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}'
без цикла for. Двойные кавычки вокруг "$ VERSION" сохраняют символы новой строки в строке. Труба все еще не нужна, что приводит к:
awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}' <<< "$VERSIONS"
Регулярное выражение игнорирует пустые строки в $VERSION
, обрабатывая только те строки, которые содержат цифру, за которой следует точка. Конечно, установка OFS в каждой строке немного неуклюжа, и «+=1
» может быть сокращено до «++
», поэтому вы можете использовать:
awk -F. '/[0-9]+\./{$NF++;print}' OFS=. <<< "$VERSIONS"
(или вы можете включить в программу 'BEGIN{OFS="."}
', но это довольно многословно.
Обозначение <<<
поддерживается только Bash, а не Korn, Bourne или другими оболочками POSIX (за исключением нестандартного расширения, параллельного нотации Bash). Программа AWK будет поддерживаться любой версией awk
, которую вы, вероятно, сможете использовать (но назначение переменных в командной строке не поддерживалось старой UNIX 7-й редакцией AWK).