awk
são bastante limitados. gawk
tem gensub()
que pode incluir pelo menos partes da porção casada na substituição, mas nenhuma operação pode ser feita nelas.
É possível com awk
, mas você precisa adotar uma abordagem diferente:
awk '{
text = $0
$0 = ""
while (match(text, /[0-9]+/)) {
$0 = $0 substr(text, 1, RSTART-1) \
(substr(text, RSTART, RLENGTH) - 1)
text = substr(text, RSTART+RLENGTH)
}
$0 = $0 text
print}'
Ou com o GNU awk
como uma variação na abordagem do @jofel:
gawk -v 'RS=[0-9]+' '{printf "%s", $0 (RT==""?"":RT-1)}'
ou
gawk -v 'RS=[^0-9]+' '{printf "%s",($0==""?"":$0 - 1)RT}'
No entanto, aqui é muito mais fácil com perl
:
perl -pe 's/\d+/$&-1/ge'
perl
pode usar grupos de captura (como $1
, $2
... e $&
para toda a parte correspondida) e com o sinal e
pode executar expressões perl
arbitrárias com esses. / p>