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.