Це в основному поза темою, але ви можете скористатися
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
.
редагувати
Як згадує akira в коментарях, оригінальна версія, що використовує glob ( ls -f *.txt
) замість find
команди, не працюватиме, оскільки глобуси обробляються самою shell ( bash
). Це означає, що перед тим, як команда навіть буде запущена, 10 мільйонів імен файлів буде замінено в командний рядок. Це майже гарантовано перевищує максимальний розмір списку аргументів команди. Ви можете використовувати xargs --show-limits
для цього інформацію про систему.
Максимальний розмір списку аргументів також враховується тим xargs
, що обмежує кількість аргументів, які він передає, до кожного виклику python відповідно до цієї межі. Оскільки xargs
доведеться ще кілька разів викликати python, пропозиція Akira використовувати os.path.walk
для отримання списку файлів, ймовірно, заощадить ваш час.
sed
на кожен файл. Я не впевнений, чи існує спосіб відкрити, редагувати, зберігати та закривати ряд файлівsed
; якщо швидкість є важливою, ви можете скористатися іншою програмою, можливо, perl або python.