Como encontrar e substituir uma string aumentando sua parte numérica?

3

Meu arquivo de entrada é

ami21 ami65
ami67 ami66
ami88 ami76 ami29
ami55 
ami54
ami32

Usando uma única linha de comando, preciso da saída como

ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56
ami55
ami33

Eu usei o comando

awk -vRS=ami '{$0=$0+1;ORS=RT}++n' inputfile > outputfile

mas eu tenho o outputfile como ami21ami65ami67ami66ami88ami76ami29ami55ami54ami32

i.e. todas as cordas são escritas na mesma linha e sem espaço. Alguém poderia me sugerir uma linha de comando melhor?

    
por tamal 24.02.2015 / 12:01

3 respostas

5

Pode ser mais fácil usar perl para isso:

$ perl -pe 's/(\d+)/$1+1/eg' foo
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33
  • -pe : percorre o arquivo, linha por linha, imprimindo cada linha depois de avaliar a expressão
  • s/(\d+)/$1+1/e : corresponde um número ( \d+ ) e substitui por seu incremento ( $1+1 ), com e sendo usado para dizer ao Perl para avaliar a substituição.

Com awk , você precisa incluir o espaço em branco no separador de registro:

$ awk -v RS='[[:space:]]*ami[[:space:]]*' '$0{$0++;}{ORS=RT}1' foo
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33
    
por muru 24.02.2015 / 12:17
2

Além da excelente resposta fornecida por "muru" se você quiser tentar algo diferente, aqui está uma maneira de Python:

#!/usr/bin/env python2
import re
with open('file_name.txt') as f:
    for line in f:
        final_list = ['ami' + str(int(value) + 1) for value in re.findall('\d+', line)]
        print ' '.join(final_list)
    
por heemayl 24.02.2015 / 13:57
1

Outra solução python através de re.sub .

$ python3 -c 'import re, sys
with open(sys.argv[1]) as f:
    for line in f:
        print(re.sub(r"\d+", lambda x: str(int(x.group())+1), line), end="")' file
ami22 ami66
ami68 ami67
ami89 ami77 ami30
ami56 
ami55
ami33
    
por Avinash Raj 24.02.2015 / 17:19