Как я могу увеличить числовую часть строки между двумя символами, используя sed, awk или grep?

У меня есть строка вроде X1.7_RC02.20170811110948, и мне нужно увеличить только число между RC и следующей точкой, например:

Исходная строка:

X1.7_RC02.20170811110948

Увеличенная строка:

X1.7_RC03.20170811110948

Как я могу увеличить в 1 (или больше это значение)?

4 ответа

Решение

С GNU СЕПГ

sed -r 's/(.*)(RC0?)([1-9]+)(\..*)/echo "\1\2$((\3+1))\4"/e' <<<X1.7_RC02.20170811110948

С GNU awk для 3-го аргумента для match():

$ awk 'match($0,/(.*RC)([^.]+)(.*)/,a){$0=sprintf("%s%02d%s",a[1],a[2]+1,a[3])} 1' file
X1.7_RC03.20170811110948

Учитывая, что ваши данные такие же, как в показанном примере, попробуйте еще раз выполнить awk и дайте мне знать, поможет ли это вам.

awk '{val=$0;gsub(/.*RC|\..*/,"",val);val=sprintf("%02d",++val);sub(/RC[0-2]+/,"RC"val);print}'  Input_file

Или, если у вас есть строка, вы можете напечатать ее значение и выполнить команду выше:

echo "$var" | awk '{val=$0;gsub(/.*RC|\..*/,"",val);val=sprintf("%02d",++val);sub(/RC[0-2]+/,"RC"val);print}' 

Решениеawk:

Начальная строка:

s="X1.7_RC02.20170811110948"

awk 'BEGIN{ FS=OFS="_RC"}{ n=substr($2,1,2); print $1,sprintf("%02.f",n+1) substr($2,3)}' <<< $s

Выход:

X1.7_RC03.20170811110948
Другие вопросы по тегам