Это в основном не по теме, но вы можете использовать
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 ...
) является скорость: вы избегаете вызова sed
10 миллионов раз. Было бы еще быстрее, если бы вы могли избежать использования Python (поскольку python довольно медленный), поэтому Perl может быть лучшим выбором для этой задачи. Я не уверен, как сделать эквивалент удобно с Perl.
Это работает так, что xargs
Python будет вызывать столько аргументов, сколько может поместиться в одной командной строке, и продолжит делать это до тех пор, пока у него не закончатся аргументы (которые предоставляются 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.