Це в основному поза темою, але ви можете скористатися
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.
Як це працює, це xargsпризведе до того, що Python викликає стільки аргументів, скільки він може вміститися в одному командному рядку, і продовжуватиме це робити, поки у нього не вичерпаються аргументи (які надаються ls -f *.txt). Кількість аргументів до кожного виклику буде залежати від довжини імен файлів і, гм, деяких інших матеріалів. fileinput.inputФункція дає послідовні рядки з файлів , названих в якості аргументів для кожного виклику, в і inplaceопція вказує , що чарівним чином «зловити» вихід і використовувати його для заміни кожного рядка.
Зауважте, що струнний replaceметод Python не використовує регулярні вирази; якщо вони вам потрібні, ви повинні import reі користуватися print re.sub(line, "blah", "blee"). Вони є Perl-сумісними RegExps, які є на зразок сильно укріплених версій тих, з якими ви отримуєте sed -r.
редагувати
Як згадує akira в коментарях, оригінальна версія, що використовує glob ( ls -f *.txt) замість findкоманди, не працюватиме, оскільки глобуси обробляються самою shell ( bash). Це означає, що перед тим, як команда навіть буде запущена, 10 мільйонів імен файлів буде замінено в командний рядок. Це майже гарантовано перевищує максимальний розмір списку аргументів команди. Ви можете використовувати xargs --show-limitsдля цього інформацію про систему.
Максимальний розмір списку аргументів також враховується тим xargs, що обмежує кількість аргументів, які він передає, до кожного виклику python відповідно до цієї межі. Оскільки xargsдоведеться ще кілька разів викликати python, пропозиція Akira використовувати os.path.walkдля отримання списку файлів, ймовірно, заощадить ваш час.
sedна кожен файл. Я не впевнений, чи існує спосіб відкрити, редагувати, зберігати та закривати ряд файлівsed; якщо швидкість є важливою, ви можете скористатися іншою програмою, можливо, perl або python.