Используйте sedс findвместоgrep
Прежде всего, я бы использовал, findа не grep, и это по трем причинам:
findпозволяет более точный выбор файлов. Например, grep -r string *.txtвыдаст файлы только в текущем каталоге; не те в подкаталогах.
findпоставляется с мощной -execопцией, которая устраняет необходимость всей --null … |xargs 0конструкции.
- В
-readableи -writableварианты findпомешают тратить время на файлы , которые не могут быть доступны.
Тест захвата
Тем не менее, grepподходит ли для первого теста, чтобы увидеть, что будет захвачено:
$ find . -exec grep term1 {} \;
или более конкретно:
$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;
Прогон, репетиция
Теперь приступайте к sedпробному запуску. sedВариантом -nявляется синонимом --quietи pв самом конце sedвыражения напечатает текущее пространство картины.
$ find . -exec sed -n 's/term1/term2/gp' {} \;
или более конкретно:
$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;
выполнение
Если все выглядит нормально, выдает окончательную команду, заменив sedопцию -nна -iдля «на месте» и удаления pв конце.
$ find . -exec sed -i 's/term1/term2/g' {} \;
или более конкретно:
$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;
Больше findпримеров
Больше findпримеров можно найти здесь .