Ceci est principalement hors sujet, mais vous pouvez utiliser
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Le principal avantage ici (sur ... xargs ... -I {} ... sed ...) est la vitesse: vous évitez d'invoquersed 10 millions de fois. Ce serait encore plus rapide si vous pouviez éviter d'utiliser Python (car python est un peu lent, relativement), donc perl pourrait être un meilleur choix pour cette tâche. Je ne sais pas comment faire l'équivalent facilement avec perl.
La façon dont cela fonctionne est d' xargsinvoquer Python avec autant d'arguments qu'il peut tenir sur une seule ligne de commande, et de continuer ainsi jusqu'à épuisement des arguments (fournis par ls -f *.txt). Le nombre d'arguments pour chaque invocation dépendra de la longueur des noms de fichiers et, euh, d'autres éléments. La fileinput.inputfonction génère des lignes successives à partir des fichiers nommés dans les arguments de chaque invocation, et l' inplaceoption lui dit de "capturer" par magie la sortie et de l'utiliser pour remplacer chaque ligne.
Notez que la replaceméthode de chaîne de Python n'utilise pas de regexps; si vous en avez besoin, vous devez les import reutiliser print re.sub(line, "blah", "blee"). Ce sont des RegExps compatibles Perl, qui sont en quelque sorte des versions fortement enrichies de celles que vous obtenez sed -r.
Éditer
Comme le mentionne akira dans les commentaires, la version originale utilisant un glob ( ls -f *.txt) à la place de la findcommande ne fonctionnerait pas car les globs sont traités par le shell ( bash) lui-même. Cela signifie qu'avant même l'exécution de la commande, 10 millions de noms de fichiers seront substitués dans la ligne de commande. Il est à peu près garanti de dépasser la taille maximale de la liste d'arguments d'une commande. Vous pouvez utiliser xargs --show-limitspour des informations spécifiques au système à ce sujet.
La taille maximale de la liste d'arguments est également prise en compte par xargs, ce qui limite le nombre d'arguments qu'elle passe à chaque appel de python en fonction de cette limite. Comme il xargsfaudra encore invoquer python plusieurs fois, la suggestion d'Akira d'utiliser os.path.walkpour obtenir la liste des fichiers vous fera probablement gagner du temps.
sedpour chaque fichier. Je ne sais pas s'il existe un moyen d'ouvrir, de modifier, d'enregistrer et de fermer une série de fichierssed; si la vitesse est essentielle, vous voudrez peut-être utiliser un programme différent, peut-être perl ou python.