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
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?
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.