Возвращает количество совпадений с помощью find / replace с помощью sed

Я пытаюсь получить счетчик числа замененных строк с помощью find и sed .

Я начинаю с:

 # find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {} \; 

Это заменяет четыре совпадения «finddddd». После выполнения этой команды я сбрасываю свой тестовый файл, чтобы команда снова работала.

Я попытался использовать wc -l . Команда найдена и заменена для экземпляров «findddd», но показывает 0 совпадений, найденных в строке ниже.

 # find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {} \; | wc -l 0 

Также попытался переместить wc -l в команду, но получить ошибки.

 find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" {}| wc -l; find: missing argument to `-exec' 0 

а также

 find . -name \*.php -exec sed -i -e "s|finddddd|replaceeeee|g" | wc -l {} \; wc: {}: No such file or directory wc: ;: No such file or directory 0 total find: missing argument to `-exec' 

Как получить базовую команду для вывода количества совпадений?

One Solution collect form web for “Возвращает количество совпадений с помощью find / replace с помощью sed”

Вы используете неправильный инструмент. wc будет подсчитывать строки ввода, но поскольку вы используете sed -i , нет строк, напечатанных так, чтобы ничего не подсчитывать wc . Даже без него команда sed напечатала все строки файла, чтобы она все еще не работала правильно. Вот другой подход:

  1. Вместо этого используйте perl

     find . -name \*.php \ -exec perl -i -lpe 's|finddddd|replaceeeee|g && print STDERR "."' {} \; \ 2>&1 | wc -l 

    Хитрость заключается в том, чтобы напечатать a . каждый раз, когда замена выполнялась успешно, затем передавайте результаты через wc . Флаг -i редактирует файл на месте, а -l вызывает добавление новой строки для каждого вызова print . -p указывает perl на печать каждой строки ввода после применения скрипта, переданного -e . Поскольку мы редактируем файл на месте, нам нужно печатать в STDERR, чтобы избежать необходимости . добавлен в файл. Затем STDERR перенаправляется на STDOUT ( 2>&1 ), что позволяет использовать wc .

  2. Если вам нужно пересчитать несколько заметок в одной строке отдельно, снова используйте perl:

     find . -name \*.php -exec \ perl -i -lpe '$l++ while s|finddddd|replaceeeee|; END{print STDERR $l}' {} + 2>&1 

    Здесь perl сам выполняет подсчет. Обратите внимание, что я использовал + вместо \; для завершения вызова -exec . Это означает, что он попытается объединить команды как можно меньше. Если у вас не так много .php файлов, все они будут переданы в один прогон perl и число будет правильным. Если у вас слишком много файлов, это не удастся, и вы должны использовать это вместо этого:

     find . -name \*.php -exec \ perl -lpe '$l++ while s|finddddd|replaceeeee|; END{print STDERR $l}' {} + 2>&1 >/dev/null | awk '{k+=$1; }END{print k}' 
  • Как считать события фразы в grep, игнорируя случай?
  • Добавить число строк и дату в имя файла
  • Количество вкладок в строке в текстовом файле с utils
  • Как напечатать несколько строк из середины файла с помощью команд оболочки unix?
  • grep с количеством отдельных паттернов
  • Список файлов, отсортированных по количеству строк, которые они содержат
  • Получить правильное количество строк в разностном выходе
  • Как найти файлы с тем же именем, но разные строки в двух каталогах?
  • Как найти файлы с длинной первой строкой?
  • Получить количество пробелов в строке?
  • команда, как wc, но с тиковым поведением
  • Linux и Unix - лучшая ОС в мире.