Intereting Posts
Grep с диапазоном и пропускает три фильтра Поиск файлов в каталоге Сделать updateb не изменять время доступа Как достичь близости процессора в контейнерах? предотвращать параллельную работу резервного копирования crontab исключает только определенную дату Сохранять сообщения из предыдущих загрузок при одновременном сохранении выходных данных журнала linux: обнаружение, если внешняя клавиатура подключена к ноутбуку Вопросы последовательности команд DEC ANSI; перемещение курсора Какие udev-атрибуты действительно доступны во время горячего / холодного подключения? Debian jessie boot зависает в «Начальном обновлении UTMP об изменениях уровня системы». Как трубопровод в этой команде в конечном итоге достигает, чтобы убить процесс? Каков вход для входа в систему openSUSE по умолчанию? Итерация по нескольким файлам в папке и присвоение значения Инициировать выпуск в BF548 EZkit

Возвращает количество совпадений с помощью 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' 

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

Вы используете неправильный инструмент. 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}'