Encontre e substitua um número por 1 adicione a ele [closed]

0

Eu tenho um arquivo grande, que contém algo como:

no = "33%"
no = "50%"

e eu tenho que aumentar o 33 & 50 por 1 , então o resultado será

no = "34%"
no = "51%"

Eu sei que isso é um problema difícil, mas se você tiver uma idéia de como resolvê-lo, ficarei feliz em ouvi-lo.

    
por Omar Elrefaei 02.05.2017 / 12:42

2 respostas

0

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.

    
por 03.05.2017 / 21:54
-1

Isso não será possível com o Regex ...

Se isso é uma coisa única, eu apenas envolvo o Excel ... Primeiro, use o Regex para inserir um separador (como uma tabulação) ao redor do número, então, algo assim

Find: (.*?)(\d+)(.*)

Replace: \t\t

Carregue isso no Excel, incremente a coluna numérica, salve tudo como texto novamente e encontre / remova os separadores.

Este é um truque / truque bobo, mas se for uma coisa de uma vez, será mais rápido do que aprender a brincar com plugins obscuros ...

    
por 03.05.2017 / 09:40