web-dev-qa-db-fra.com

Grep: compte le nombre de correspondances par ligne

J'essaie d'obtenir le nombre de correspondances (dans ce cas, les occurrences de { ou }) dans chaque ligne d'un fichier .tex.

Je sais que l'indicateur -o ne renvoie que la correspondance, mais il renvoie chaque correspondance sur une nouvelle ligne, même en combinaison avec l'indicateur -n. Je ne sais pas ce que je pourrais faire pour compter les répétitions. L'indicateur -c renvoie uniquement le nombre total de correspondances dans le fichier entier. Peut-être pourrais-je diriger une ligne à la fois vers grep?

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

La sortie sera quelque chose comme:

3 1
1 2

Signification 3 occurrences dans la première ligne et 1 dans la seconde.

Tiré de https://stackoverflow.com/a/15366097/3378354 .

25
Moebius

Après avoir lu diverses solutions, je pense que c’est l’approche la plus simple au problème:

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

L'utilisation de grep est-elle une exigence? Voici une alternative:

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

La sed supprime tous les caractères autres que { et } (en ne laissant que les caractères { et }), puis la awk compte les caractères sur chaque ligne (qui ne sont que les caractères { et }). Pour supprimer les lignes sans correspondance,

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

Notez que ma solution suppose (nécessite) que les chaînes que vous recherchez sont des caractères uniques. La réponse de Moebius s’adapte plus facilement aux chaînes multi-caractères. En outre, aucune de nos réponses n’exclut les occurrences citées ou échappées des caractères/chaînes d’intérêt; par exemple.,

{ "nullfunc() {}" }

serait considéré comme contenant quatre caractères d'accolade.

1
Scott