it-swarm.com.de

Regex-Muster-Übereinstimmungen in einer Zeile mit sed oder grep zählen?

Ich möchte die Anzahl der Übereinstimmungen in einer einzelnen Zeile zählen (oder alle Zeilen, da es immer nur eine Zeile gibt).

Ich möchte nicht nur eine Übereinstimmung pro Zeile wie in zählen

echo "123 123 123" | grep -c -E "123" # Result: 1

Besseres Beispiel:

echo "1 1 2 2 2 5" | grep -c -E '([^ ])( \1){1}' # Result: 1, expected: 2 or 3
26
Tyilo

Sie könnten grep -o verwenden und dann wc -l durchgehen:

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

Vielleicht sollten Sie Leerzeichen zuerst in Zeilenumbrüche konvertieren:

$ echo "1 1 2 2 2 5" | tr ' ' $'\n' | grep -c 2
3
1
glenn jackman

Warum verwenden Sie nicht awk? Sie können awk '{print gsub(your_regex,"&")}' Verwenden, um die Anzahl der Übereinstimmungen in jeder Zeile auszudrucken, oder awk '{c+=gsub(your_regex,"&")}END{print c}' , Um die Gesamtzahl der Übereinstimmungen zu drucken. Beachten Sie, dass die relative Geschwindigkeit abhängig von der verwendeten awk-Implementierung und der Eingabe variieren kann.

0
jarno

Das könnte für Sie funktionieren:

sed -n -e ':a' -e 's/123//p' -e 'ta' file | sed -n '$='

GNU sed könnte geschrieben werden:

sed -n ':;s/123//p;t' file | sed -n '$='
0
potong

Vielleicht unten:

echo "123 123 123" | sed "s/123 /123\n/g" | wc -l

(vielleicht hässlich, aber mein bash fu ist nicht so toll)

0
manojlds