Le comptage des regex modèle correspond à une ligne à l'aide de sed ou grep?
Je veux compter le nombre de matchs il est sur une seule ligne (ou toutes les lignes qu'il y en aura toujours qu'une seule ligne).
Je veux comptent pas un seul 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}' # Result: 1, expected: 2 or 3
- les données sont toujours séparés par des espaces?
- Il y aura toujours être seulement "données" parce que peut-être je veux correspondre
123 123
3 (ou 2) fois dans123 123 123 123
- +1 pour la question, -1 pour le bizarre regex exemple
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
grep -o
alors conduite parwc -l
:-o
est 🙁egrep
? Même chose serait de travailler w/egrep
egrep
dit la même chose. Je suis sur Windows, donc je pense que c'est prévu."1 1"
(octets 1 à 3), 2)" "
(c'est à dire zéro cas de quelque chose qui n'est pas un espace, suivi d'un espace, suivi par le même zéro cas de nouveau - octet 4), 3)"2 2"
(octets 5 à 7), 4)" "
(octet 8) et enfin 5)" "
(octet 10). Ouf!wc -l
à la fin et vous verrez.)echo "1 1 2 2 2 5" | grep -o -E '([^ ])( \1){1}' | wc -l
grep -o
de ne pas rembobiner sur trouver un match, donc cela ne correspond à "1 1" (octets 1 à 3) et "2 2" (octets 5-7). Qu'il ne correspond pas octets 7 à 9 ("2 2"), parce que le temps vient à considérer octets 8, c'est déjà consommé octets 1 à 7 dans les deux précédents matches.Peut-être vous devriez convertir les espaces pour les retours à la ligne en premier:
Peut-être ci-dessous:
( peut-être moche, mais mon bash fu n'est pas très bonne )
\n
Pourquoi ne pas utiliser awk?
Vous pouvez utiliser
awk '{print gsub(your_regex,"&")}'
pour imprimer le nombre de matchs sur chaque ligne, ou
awk '{c+=gsub(your_regex,"&")}END{print c}'
pour imprimer le nombre total de matches. Notez que la vitesse relative peut varier en fonction awk mise en œuvre est utilisée, et qui d'entrée.
gawk -v FPAT=your_regex '{print NF}'
ougawk -v FPAT=your_regex '{c+=NF}END{print c}'
, respectivement.Cela pourrait fonctionner pour vous:
GNU sed peut être écrite:
a'". It seems to work better, if you replace
:ta` par:a
. Les scripts semble exiger de saut de ligne à la fin de intput. En outre, le script affiche rien, si aucune correspondance n'est trouvée. Test:printf 123 | sed -n ':;s/123//p;t' | sed -n '$='
sorties de rien.