Je veux compter le nombre de correspondances sur une seule ligne (ou toutes les lignes car il n'y aura toujours qu'une seule ligne).
Je veux compter pas seulement un match par ligne comme dans
echo "123 123 123" | grep -c -E "123" # Result: 1
Meilleur exemple:
echo "1 1 2 2 2 5" | grep -c -E '([^ ])( \1){1}' # Result: 1, expected: 2 or 3
Vous pouvez utiliser grep -o
puis faire suivre wc -l
:
$ echo "123 123 123" | grep -o 123 | wc -l
3
Peut-être devriez-vous d'abord convertir les espaces en nouvelles lignes:
$ echo "1 1 2 2 2 5" | tr ' ' $'\n' | grep -c 2
3
Pourquoi ne pas utiliser awk? Vous pouvez utiliser awk '{print gsub(your_regex,"&")}'
Pour imprimer le nombre de correspondances sur chaque ligne, ou awk '{c+=gsub(your_regex,"&")}END{print c}'
Pour imprimer le nombre total de correspondances. Notez que la vitesse relative peut varier en fonction de l'implémentation awk utilisée et des entrées fournies.
Cela pourrait fonctionner pour vous:
sed -n -e ':a' -e 's/123//p' -e 'ta' file | sed -n '$='
GNU sed pourrait être écrit:
sed -n ':;s/123//p;t' file | sed -n '$='
Peut-être ci-dessous:
echo "123 123 123" | sed "s/123 /123\n/g" | wc -l
(peut-être moche, mais mon bash fu n'est pas terrible)