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 sed10 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 xargsinvocará 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.inputfunção gera linhas sucessivas dos arquivos nomeados nos argumentos de cada chamada, e a inplaceopção diz para "capturar" magicamente a saída e usá-la para substituir cada linha.
Observe que o replacemétodo de string do Python não usa regexps; se você precisar, precisa import ree 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 findcomando 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-limitspara 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 xargsainda será necessário chamar o python algumas vezes, a sugestão de akira os.path.walkpara obter a lista de arquivos provavelmente economizará algum tempo.
sedpara 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.