Подсчет совпадений с регулярным выражением в одной строке, используя sed или grep? - PullRequest
28 голосов
/ 31 мая 2011

Я хочу посчитать количество совпадений в одной строке (или во всех строках, поскольку всегда будет только одна строка).

Я хочу посчитать не одно совпадение в каждой строке, как в

echo "123 123 123" | grep -c -E "123" # Result: 1

Лучший пример:

echo "1 1 2 2 2 5" | grep -c -E '([^ ])( \1){1}' # Result: 1, expected: 2 or 3

Ответы [ 5 ]

50 голосов
/ 31 мая 2011

Вы можете использовать grep -o, затем передать через wc -l:

$ echo "123 123 123" | grep -o 123 | wc -l
3
1 голос
/ 31 мая 2011

Возможно, вам следует сначала преобразовать пробелы в новые строки:

$ echo "1 1 2 2 2 5" | tr ' ' $'\n' | grep -c 2
3
0 голосов
/ 04 сентября 2015

Это может работать для вас:

sed -n -e ':a' -e 's/123//p' -e 'ta' file | sed -n '$='

GNU sed может быть написано:

sed -n ':;s/123//p;t' file | sed -n '$='
0 голосов
/ 03 сентября 2015

Почему бы не использовать awk?Вы можете использовать awk '{print gsub(your_regex,"&")}' для печати количества совпадений в каждой строке или awk '{c+=gsub(your_regex,"&")}END{print c}' для печати общего количества совпадений.Обратите внимание, что относительная скорость может варьироваться в зависимости от того, какая реализация awk используется и какой ввод дается.

0 голосов
/ 31 мая 2011

Может быть ниже:

echo "123 123 123" | sed "s/123 /123\n/g" | wc -l

(может быть, некрасиво, но мой баш-фу не настолько хорош)

...