web-dev-qa-db-fra.com

Compter les motifs de regex correspond dans une ligne en utilisant sed ou grep?

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
26
Tyilo

Vous pouvez utiliser grep -o puis faire suivre wc -l:

$ echo "123 123 123" | grep -o 123 | wc -l
3
49
Simon Whitaker

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
1
glenn jackman

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.

0
jarno

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 '$='
0
potong

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)

0
manojlds