https://stackoverflow.com/a/14348899/15603477
Eu entendo a seguinte resposta.
sed -r 's/(.*)(\?cache_version=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' file
Mas eu me pergunto como fazer isso em awk.
Para transformar barbaz?cache_version=3fooooo
em barbaz?cache_version=4fooooo
O test1
conteúdo do arquivo como
ello
barbaz?cache_version=3fooooo
bye
A condição é localizar a linha conter cache_version=
e, em seguida, aumentar o valor numérico na linha correspondente em 1.
Eu até não consigo localizar o valor numérico correspondente, nem mesmo mencionar aumentar o valor numérico.
Até agora eu só localizo a linha específica por
awk '{if(/cache_version=([[:digit:]+])/) print $1}' < test1
Supondo que o número seja sempre um número inteiro:
no bloco BEGIN{} definimos o campo de entrada S eparator e também o campo de saída S eparator para um único caractere igual ;
=
então aqui estamos fazendo
awk '/pattern-matching(regexp)/ { "actions" }
, quais ações dentro do{...}
bloco serão executadas apenas para a linha correspondente com o regexpcache_version
;a função match(s, r [, a]) , retorne a posição em
s
que a expressão regularr
ocorre, ou zero ser
não estiver presente, e defina os valores de RSTART (onde ocorre a posição inicial da expressão regularr
) e RLENGTH ( o comprimento em caracteres da substring/regexp correspondente).Nota: Eu costumava
$NF+1
forçar o awk a fazer a conversão de string para inteiro, pois sei que os dígitos estão na posição inicial do $NF (enquanto vocêsubstr($NF,1, RLENGTH)+1
também pode processar) , e depois redefinir o $NF do arquivosubstr($NF, RLENGTH+1)
.Nota: altere o regex no
match($NF, /^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?/)
, para corresponder a quase todos os tipos de dígitos (você também pode usar os controles de impressão adequados, consulte OFMT )Você pode usar a
match
função ingawk
para capturar grupos em uma matriz e imprimir cada elemento enquanto incrementa o dígito capturado: