Возвращает количество совпадений с помощью 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}' 
  • Подсчитывать строки без прерывания ввода
  • Подсчитайте количество символов в указанном имени файла
  • Нужно что-то быстрее, чем «wc -l»
  • Добавить результат подсчета слов в конец файла
  • Получить количество пробелов в строке?
  • `ls / | wc -l` указывает больше строк, чем `ls /` показывает
  • Время, необходимое для вывода трубы на голову / хвост
  • Подсчитайте строки, соответствующие шаблону и соответствующие предыдущей строке
  • Рекурсивно печатать длину файла
  • Количество вкладок в строке в текстовом файле с utils
  • Команда для печати количества файлов * .pdf в выбранном каталоге
  • команда wc подсчитывает дополнительные символы
  • Interesting Posts

    Какие журналы GNU / Linux, электронные журналы доступны?

    Где я могу получить пакет «kernel-default-debuginfo» для SLES 11?

    Как предоставить sftp доступ к подкаталогу только не к родительскому

    Установка общей папки Windows при запуске без сохранения пароля в текстовом виде

    Как я могу изменить переключатель рабочего пространства в Cinnamon?

    Как узнать, где установлено содержимое пакета?

    Перенаправить stdin и stdout в порты

    Как установить Wine 1.7.50 на mac

    Редактирование файла eps, созданного Tecplot

    как изменить соответствия регулярному выражению с помощью sed или другого инструмента?

    dpkg: error: невозможно удалить архитектуру «i386», используемую в настоящее время базой данных

    Могу ли я иметь условные операторы на основе сервера в файле .htaccess?

    SSH-подобный сеанс, который выживает при отключении физической сети

    iptables блокирует весь входящий и исходящий трафик, за исключением моих IP-адресов

    Запуск sh-файла работает только в том случае, если каталог cd'd для скриптов

    Linux и Unix - лучшая ОС в мире.