grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c
A saída será algo como:
3 1
1 2
Significado 3 ocorrências na primeira linha e 1 na segunda.
Estou tentando obter o número de correspondências (neste caso, ocorrências de { ou } ) em cada linha de um arquivo .tex.
Eu sei que o -o sinalizador retorna apenas a correspondência, mas retorna cada correspondência em uma nova linha, mesmo combinada com o -n sinalizador. Eu não sei de nada que eu possa canalizar para contar as repetições. O -c flag só retorna o número total de correspondências em todo o arquivo - talvez eu pudesse canalizar uma linha de cada vez para grep?
Depois de ler várias soluções, acho que essa é a abordagem mais fácil para o problema:
while read i; do echo $i |grep -o "matchingString"| wc -l; done < input.txt
Está usando grep um requisito? Aqui está uma alternativa:
sed 's/[^{}]//g' your_file | awk '{print NR, length }'
O sed retira todos os caracteres que não sejam { e }
(isto é, deixando apenas { e } caracteres),
e, em seguida, o awk conta os caracteres em cada linha (que são apenas os caracteres { e } ).
Para suprimir linhas sem correspondências,
sed 's/[^{}]//g' your_file | awk '/./ {print NR, length }'
Observe que minha solução assume (requer) que as strings que você está procurando sejam caracteres únicos. A resposta de Moebius é mais facilmente adaptada para strings com vários caracteres. Além disso, nenhuma das nossas respostas exclui ocorrências citadas ou escapadas dos caracteres / cadeias de interesse; por exemplo,
{ "nullfunc() {}" }
seria considerado como contendo quatro caracteres de chave.