Подсчет совпадений шаблонов регулярных выражений в одной строке с помощью sed или grep?

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

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

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

удачный пример:

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

5 ответов


можно использовать grep -o тогда труба через wc -l:

$ echo "123 123 123" | grep -o 123 | wc -l
3

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

$ echo "1 1 2 2 2 5" | tr ' ' $'\n' | grep -c 2
3

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

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

(может быть, уродливый, но мой bash fu не так велик)


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


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

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

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

sed -n ':;s/123//p;t' file | sed -n '$='