Questo è per lo più fuori tema, ma potresti usarlo
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Il vantaggio principale qui (oltre ... xargs ... -I {} ... sed ...) è la velocità: eviti di invocare sed10 milioni di volte. Sarebbe ancora più veloce se tu potessi evitare di usare Python (dato che python è un po 'lento, relativamente), quindi perl potrebbe essere una scelta migliore per questo compito. Non sono sicuro di come fare l'equivalente convenientemente con il perl.
Il modo in cui funziona è che xargsinvocherà Python con tutti gli argomenti che può stare su una singola riga di comando e continuerà a farlo fino a quando non si esauriscono gli argomenti (che vengono forniti da ls -f *.txt). Il numero di argomenti per ogni invocazione dipenderà dalla lunghezza dei nomi dei file e, um, da alcune altre cose. La fileinput.inputfunzione produce righe successive dai file indicati negli argomenti di ogni invocazione e l' inplaceopzione dice di "catturare" magicamente l'output e usarlo per sostituire ogni riga.
Nota che il replacemetodo stringa di Python non usa regexps; se ne hai bisogno, devi import ree usalo print re.sub(line, "blah", "blee"). Sono RegExps compatibili con Perl, che sono una specie di versioni fortemente fortificate di quelle che ottieni sed -r.
modificare
Come Akira menziona nei commenti, la versione originale che utilizza un glob ( ls -f *.txt) al posto del findcomando non funzionerebbe perché i globs vengono elaborati dalla shell ( bash) stessa. Ciò significa che prima ancora che il comando venga eseguito, nella riga di comando verranno sostituiti 10 milioni di nomi di file. Questo è praticamente garantito per superare la dimensione massima dell'elenco di argomenti di un comando. È possibile utilizzare xargs --show-limitsper informazioni specifiche del sistema su questo.
Viene inoltre presa in considerazione la dimensione massima dell'elenco degli argomenti xargs, che limita il numero di argomenti che passa a ciascuna invocazione di Python in base a tale limite. Dato che xargsdovrà ancora invocare Python parecchie volte, il suggerimento di Akira da usare os.path.walkper ottenere l'elenco dei file probabilmente ti farà risparmiare un po 'di tempo.
sedper ogni file. Non sono sicuro che esista un modo per aprire, modificare, salvare e chiudere una serie di filesed; se la velocità è essenziale, potresti voler usare un programma diverso, forse perl o python.