it-swarm.com.de

Zählen Sie Vorkommen eines Zeichens in einer Zeichenfolge mithilfe von Bash

Ich muss den Anzahl der Vorkommen eines Zeichens in einer Zeichenfolge mit Bash zählen.

Wenn das Zeichen im folgenden Beispiel t ist, ist echos die richtige Anzahl von Vorkommen von t in var, aber wenn das Zeichen ein Komma oder ein Semikolon ist, wird Null ausgegeben:

var = "text,text,text,text" 
num = `expr match $var [,]`
echo "$num"
85
Jericob

Ich würde den folgenden awk Befehl verwenden:

string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"

Ich teile den String durch $char und drucke die Anzahl der resultierenden Felder minus 1.

Wenn Ihre Shell den Operator <<< nicht unterstützt, verwenden Sie echo:

echo "${string}" | awk -F"${char}" '{print NF-1}'
83
hek2mgl

sie können zum Beispiel alle anderen Zeichen entfernen und das verbleibende zählen, wie:

var="text,text,text,text"
res="${var//[^,]}"
echo "$res"
echo "${#res}"

wird drucken

,,,
3

oder

tr -dc ',' <<<"$var" | awk '{ print length; }'

oder

tr -dc ',' <<<"$var" | wc -c    #works, but i don't like wc.. ;)

oder

awk -F, '{print NF-1}' <<<"$var"

oder

grep -o ',' <<<"$var" | grep -c .

oder

Perl -nle 'print s/,//g' <<<"$var"
85
jm666

Sie können dies tun, indem Sie die Befehle tr und wc kombinieren. Zum Beispiel, um e in der Zeichenfolge referee zu zählen

echo "referee" | tr -cd 'e' | wc -c

ausgabe

4

Erklärungen: Mit dem Befehl tr -cd 'e' werden alle Zeichen außer 'e' entfernt. Mit dem Befehl wc -c werden die verbleibenden Zeichen gezählt.

Mehrere Eingabezeilen eignen sich auch für diese Lösung, wie der Befehl cat mytext.txt | tr -cd 'e' | wc -c kann e in der Datei mytext.txt zählen, auch wenn die Datei möglicherweise viele Zeilen enthält.

38
Robin Hsu

Aufbauend auf den großartigen Antworten und Kommentaren aller, ist dies die kürzeste und süßeste Version:

grep -o "$needle" <<< "$haystack" | wc -l

1
rmanna

awk funktioniert gut, wenn Sie es auf Ihrem Server haben

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"
1
user2508516

Ich würde folgendes vorschlagen:

var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"

Kein Aufruf eines anderen Programms

0
Mathew P V