grep -c
полезен для определения количества встреч строк в файле, но он учитывает каждый случай только один раз в строке. Как посчитать несколько вхождений на строку?
Я ищу что-то более элегантное, чем:
perl -e '$_ = <>; print scalar ( () = m/needle/g ), "\n"'
grep
это указано, но для всехack
, кто использует , ответ простоack -ch <pattern>
.Ответы:
grep's
-o
будет выводить только совпадения, игнорируя строки;wc
можно их посчитатьЭто также будет соответствовать «иглам» или «многоигольным иглам».
Только отдельные слова:
источник
\b
и\B
делать здесь?uniq
удаляет только смежные идентичные строки, которые вам нужноsort
перед подачей,uniq
если вы еще не уверены, что дубликаты всегда будут соседними.Если у вас есть GNU Grep (всегда на Linux и Cygwin, иногда в других местах), вы можете рассчитывать выходные строки из
grep -o
:grep -o needle | wc -l
.С Perl, вот несколько способов, которые я нахожу более элегантными, чем ваш (даже после исправления ).
При использовании только инструментов POSIX одним из подходов, если это возможно, является разбиение ввода на строки с одним соответствием перед передачей его в grep. Например, если вы ищете целые слова, то сначала превратите каждый несловарный символ в новую строку.
В противном случае, нет стандартной команды для выполнения этой конкретной части обработки текста, поэтому вам нужно переключиться на sed (если вы мазохист) или awk.
Вот более простое решение, использующее
sed
иgrep
, которое работает со строками или даже регулярными выражениями, но не работает в нескольких угловых случаях с закрепленными шаблонами (например, оно находит два вхождения^needle
или\bneedle
вneedleneedle
).Обратите внимание, что в приведенных выше заменах sed я имел
\n
в виду перевод строки. Это стандартно в части шаблона, но в тексте замены, для переносимости, используется замена на обратную косую черту для новой строки\n
.источник
Если, как и я, вы на самом деле хотели
«оба; каждый ровно один раз»(это на самом деле «либо; дважды»), тогда все просто:и проверьте вывод
2
.Преимущество этого подхода (если только один раз это то , что вы хотите), что она легко масштабируется.
источник
Другое решение с использованием awk и в
needle
качестве разделителя полей:Если вы хотите, чтобы совпадение
needle
сопровождалось пунктуацией, измените разделитель полей соответственно, т.е.Или используйте класс:
[^[:alnum:]]
для охвата всех не буквенных символов.источник
В вашем примере выводится только количество вхождений на строку, а не общее количество в файле. Если это то, что вы хотите, что-то вроде этого может работать:
источник
Это мое чистое решение от Bash
источник