Isso é principalmente fora de tópico, mas você pode usar
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
O principal benefício aqui (acima ... xargs ... -I {} ... sed ...
) é a velocidade: você evita invocar sed
10 milhões de vezes. Seria mais rápido ainda se você pudesse evitar o uso do Python (já que o python é meio lento, relativamente), então o perl pode ser uma escolha melhor para esta tarefa. Não sei como fazer o equivalente convenientemente com o perl.
A maneira como isso funciona é que xargs
invocará o Python com o maior número de argumentos possível em uma única linha de comando e continuará fazendo isso até que fique sem argumentos (que estão sendo fornecidos por ls -f *.txt
). O número de argumentos para cada invocação dependerá do tamanho dos nomes dos arquivos e de outras coisas. A fileinput.input
função gera linhas sucessivas dos arquivos nomeados nos argumentos de cada chamada, e a inplace
opção diz para "capturar" magicamente a saída e usá-la para substituir cada linha.
Observe que o replace
método de string do Python não usa regexps; se você precisar, precisa import re
e usa print re.sub(line, "blah", "blee")
. Eles são RegExps compatíveis com Perl, que são uma espécie de versões altamente fortificadas daquelas com as quais você se relaciona sed -r
.
editar
Como akira menciona nos comentários, a versão original usando um glob ( ls -f *.txt
) no lugar do find
comando não funcionaria porque os globs são processados pelo próprio shell ( bash
). Isso significa que, antes que o comando seja executado, 10 milhões de nomes de arquivos serão substituídos na linha de comando. É praticamente garantido que exceda o tamanho máximo da lista de argumentos de um comando. Você pode usar xargs --show-limits
para obter informações específicas do sistema sobre isso.
O tamanho máximo da lista de argumentos também é levado em consideração por xargs
, o que limita o número de argumentos que ele passa para cada chamada de python de acordo com esse limite. Como xargs
ainda será necessário chamar o python algumas vezes, a sugestão de akira os.path.walk
para obter a lista de arquivos provavelmente economizará algum tempo.
sed
para cada arquivo. Não tenho certeza se existe uma maneira de abrir, editar, salvar e fechar uma série de arquivossed
; se a velocidade for essencial, convém usar um programa diferente, talvez perl ou python.