Pode ser possível fazer isso (com algumas restrições)
com uma abordagem puramente regex,
mas tal solução seria muito desagradável e um pouco feia.
No entanto, isso não é difícil em awk
:
awk '
{
n=0
if ($0 ~ /no = "[0-9]+%"/) {
n = split($0, part, /"/)
if (n == 3) print part[1] "\"" part[2]+1 "%\"" part[3]
}
if (n != 3) print
}'
A declaração (primeiro) if
testa se a linha de entrada contém os caracteres no = "
,
seguido por um ou mais dígitos, seguido por %"
.
(Se você quiser combinar apenas no início de uma linha,
adicione um ^
entre o primeiro /
e o no
.
Se você quiser corresponder apenas no final de uma linha,
adicione um $
entre o %"
e o segundo /
.)
Em seguida, split
a linha é separada entre aspas.
A variável n
recebe o número de partes;
para no = "33%"
, a contagem é 3,
e as partes são no =
, 33%
e uma string vazia
(porque não há nada após o segundo "
).
(Observe que as aspas não aparecem nas partes,
porque eles são os separadores.)
part[2]+1
será avaliado como 34
,
porque awk
ignorará o %
após o 33
,
e então a instrução print
reposiciona as partes da linha,
com o número aumentado em um.
Como indicado acima, este script permite outras coisas na linha antes e depois do número - mas eles não podem conter citações. Por exemplo,
The quick brown fox no = "33%" What did the bird say?
jumps over the lazy dog. no = "50%" Quoth the raven, "Nevermore."
será convertido para
The quick brown fox no = "34%" What did the bird say?
jumps over the lazy dog. no = "50%" Quoth the raven, "Nevermore."
Se uma linha não contiver no = "number%"
,
não entrará no bloco if
,
e assim chegará ao fundo com n
igual a 0.
Se ele contiver no = "number%"
,
mas tem aspas adicionais, então irá entrar no bloco if
,
e n
será igual ao número de caracteres de cotação mais um.
De qualquer maneira, o if (n != 3) print
fará com que a linha de entrada seja gravada, não modificada.
awk
é um programa padrão no Unix, Linux e outros sistemas semelhantes ao Unix.
(Eu testei esse script com a opção --posix
,
então acredito que não depende de nenhuma extensão GNU.)
Se você não tem acesso a uma máquina Unix (como a) completa,
Eu sugiro que você instale o Cygwin,
ou simplesmente encontre uma versão de awk
que é executada em qualquer máquina.