Você pode considerar o uso de perl
, por exemplo,
perl -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' file.java
As (?<=Height\()
e (?=\);)
são afirmações de tamanho zero ou lookarounds que limitam as correspondências à região específica entre esses delimitadores, após o que os valores numéricos são extraídos usando grupos de captura valores $1
... $3
podem então ser manipulados na expressão de substituição usando sprintf
com o modificador /e
(evaluate).
Para aplicar recursivamente, você pode usar o comando find
, por exemplo,
find . -name '*.java' -execdir perl -i'.bak' -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' {} \;
Executando em seu arquivo de teste:
$ perl -i'.bak' -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' bop.txt
usando então diff
para confirmar a substituição
$ diff bop.txt.bak bop.txt
12c12
< private static final Height biomeHeight = new Height(8.0F, 0.025F);
---
> private static final Height biomeHeight = new Height(16F, 0.05F);