Как насчет:
awk -F '.pgp' '{print $1 FS}'
У меня возникло бы искушение использовать perl -pe 's/\.pgp\K.*//'
вместо awk.
Учитывая ваш обновленный пример, это может быть то, что вы хотите, используя GNU awk для соответствия 3-го аргумента():
awk 'match($0,/(.*<modelVersion>)([0-9]+)(.*)/,a) {$0=a[1] a[2]+1 a[3]} 1' file
Чтобы обновить исходный файл, вы можете использовать awk -i inplace '...' file
, так как для вышеприведенного в любом случае требуется GNU awk, который поддерживает -i inplace
.
Оригинальный ответ :Это может быть то, что вы хотите, используя GNU awk для соответствия 3-го аргумента():
awk 'match($0,/(.*<modelVersion>)([0-9]+)(.*)/,a) {$0=a[1] (++cnt) a[3]} 1' file
Приведенное выше не проверено, так как ваши требования не ясны, мы не можем протестировать увеличение значения с помощью примера ввода, который содержит только 1 значение, и вы не предоставили никаких ожидаемых результатов.
Используйте следующий скрипт awk
:
awk '/<modelVersion>/ {
temp = $0
sub(/.*<modelVersion>/, "", temp)
sub(/\..*/, "", temp)
incremented = temp+1
sub(temp, incremented)
}
{ print }
'
modelVersion
. <modelVersion>
(и все предшествующие ему )из копии строки, … .
и все после него. Это оставляет первый компонент номера версии; например, 42.0.0
→ 42
. 43
). Запустите команду awk
с выводом в файл:
awk '(the above)' pom.xml > new.xmlпроверьте правильность вывода, а затем
mv new.xml pom.xml