como substituir uma expressão sed / perl (alterar e imprimir apenas uma linha combinada) com uma expressão python?

1

Eu perguntei a esta questão para saber como perl poderia substituir sed .

Agora eu quero saber como os seguintes comandos (que fazem a mesma coisa) se pareceriam com python :

sed -n '/patternmatch/s%stuff%changed%p' file

perl -ne 'if ( /patternmatch/ ) { s%stuff%changed%; print }' file

É possível escrevê-lo como um one-liner? Alternativa?

    
por erik 16.07.2015 / 01:45

2 respostas

4

Apenas por diversão:

python -c 'import sys,fileinput,re;sys.stdout.writelines(re.sub("stuff", "changed", l, 1) for l in fileinput.input() if re.search("patternmatch", l))' file

Não faça isso :) Use sed / perl / awk

    
por 16.07.2015 / 05:32
2

Vamos fazer isso usando um exemplo simples, considere por um arquivo, vamos substituir cada dígito de uma linha com a string HELLO , se a linha não tiver nenhum dígito, então deixe como está:

#!/usr/bin/env python2
import re
with open('file.txt') as f:
    for line in f:
        if re.search(r'\d', line):
            print re.sub(r'\d', 'HELLO', line).rstrip('\n')
        else:
            print line.rstrip('\n')

Teste:

$ cat file.txt 
foo bar test
spam 1 egg 5

$ python script.py 
foo bar test
spam HELLO egg HELLO

O mesmo usando sed :

$ sed '/[[:digit:]]/s/[[:digit:]]/HELLO/g' file.txt 
foo bar test
spam HELLO egg HELLO

Vamos verificar o time stat:

$ time sed '/[[:digit:]]/s/[[:digit:]]/HELLO/g' file.txt 
foo bar test
spam HELLO egg HELLO

real    0m0.001s
user    0m0.000s
sys 0m0.001s

$ time python script.py 
foo bar test
spam HELLO egg HELLO

real    0m0.017s
user    0m0.007s
sys 0m0.010s

Como você pode ver usando ferramentas de processamento de texto nativo ( sed , awk etc) seria sua melhor aposta em tais circunstâncias.

    
por 16.07.2015 / 06:13