Это в основном не по теме, но вы можете использовать
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Основным преимуществом здесь (сверх ... xargs ... -I {} ... sed ...) является скорость: вы избегаете вызова sed10 миллионов раз. Было бы еще быстрее, если бы вы могли избежать использования Python (поскольку python довольно медленный), поэтому Perl может быть лучшим выбором для этой задачи. Я не уверен, как сделать эквивалент удобно с Perl.
Это работает так, что xargsPython будет вызывать столько аргументов, сколько может поместиться в одной командной строке, и продолжит делать это до тех пор, пока у него не закончатся аргументы (которые предоставляются ls -f *.txt). Количество аргументов для каждого вызова будет зависеть от длины имен файлов и некоторых других вещей. fileinput.inputФункция дает последовательные строки из файлов , названных в качестве аргументов для каждого вызова, в и inplaceопция указывает , что волшебным образом «поймать» выход и использовать его для замены каждой строки.
Обратите внимание, что строковый replaceметод Python не использует регулярные выражения; если вам это нужно, вы должны import reи использовать print re.sub(line, "blah", "blee"). Это Perl-совместимые RegExps, которые являются своего рода сильно укрепленными версиями тех, что вы получаете сsed -r .
редактировать
Как упоминает Акира в комментариях, оригинальная версия с использованием glob ( ls -f *.txt) вместо findкоманды не будет работать, потому что globs обрабатываются самой shell ( bash). Это означает, что перед выполнением команды в командной строке будет подставлено 10 миллионов имен файлов. Это в значительной степени гарантированно превышает максимальный размер списка аргументов команды. Вы можете использовать xargs --show-limitsдля системной информации об этом.
Максимальный размер списка аргументов также принимается во внимание xargs, что ограничивает количество аргументов, которые он передает каждому вызову python в соответствии с этим пределом. посколькуxargs все еще придется вызывать python несколько раз, предложение Акиры использовать его os.path.walkдля получения списка файлов, вероятно, сэкономит вам некоторое время.
sedдля каждого файла. Я не уверен, есть ли способ открывать, редактировать, сохранять и закрывать ряд файловsed; если скорость важна, вы можете использовать другую программу, например, Perl или Python.