21

Я пытаюсь получить количество совпадений (в данном случае вхождений { или }) в каждой строке файла .tex.

Я знаю, что флаг -o возвращает только совпадение, но он возвращает каждое совпадение на новой строке, даже в сочетании с флагом -n . Я не знаю ничего, что я мог бы передать это, чтобы посчитать повторы. Флаг -c возвращает только общее количество совпадений во всем файле - может быть, я мог бы передать одну строку за один раз в grep?

3 ответа3

23
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

Вывод будет примерно таким:

3 1
1 2

Значение 3 вхождения в первой строке и 1 во второй.

Взято с https://stackoverflow.com/a/15366097/3378354 .

3

Прочитав различные решения, я думаю, что это самый простой подход к проблеме:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt
1

Требуется ли использование grep ?  Вот альтернатива:

sed 's/[^{}]//g' your_file | awk '{print NR, length }'

sed удаляет все символы, кроме { и } (т. Е. Оставляя только символы { и } ), и затем awk считает символы в каждой строке (которые являются только символами { и } ).  Чтобы подавить строки без совпадений,

sed 's/[^{}]//g' your_file | awk '/./ {print NR, length }'

Обратите внимание, что мое решение предполагает (требует), что строки, которые вы ищете, являются одиночными символами.  Ответ Мебиуса легче адаптировать к многосимвольным строкам.  Кроме того, ни один из наших ответов не исключает цитируемые или экранированные вхождения символов / строк, представляющих интерес; например,

{ "nullfunc() {}" }

будет считаться содержать четыре символа скобки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .