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>