web-dev-qa-db-fra.com

Compter les occurrences d'un caractère dans une chaîne à l'aide de Bash

Je dois compter le nombre d'occurrences d'un caractère dans une chaîne à l'aide de Bash.

Dans l'exemple suivant, lorsque le caractère est (par exemple) t, il echos le nombre correct d'occurrences de t dans var, mais lorsque le caractère est une virgule ou un point-virgule, il affiche zéro:

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

J'utiliserais la commande awk suivante:

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

Je divise la chaîne par $char et affiche le nombre de champs résultants moins 1.

Si votre shell ne prend pas en charge l'opérateur <<<, utilisez echo:

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

vous pouvez par exemple supprimer tous les autres caractères et compter le reste, comme:

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

imprimera

,,,
3

ou

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

ou

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

ou

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

ou

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

ou

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

Vous pouvez le faire en combinant les commandes tr et wc. Par exemple, compter e dans la chaîne referee

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

sortie

4

Explications: La commande tr -cd 'e' supprime tous les caractères autres que 'e' et la commande wc -c compte les caractères restants.

Plusieurs lignes d'entrée sont également utiles pour cette solution, comme la commande cat mytext.txt | tr -cd 'e' | wc -c peut compter e dans le fichier mytext.txt, même si le fichier peut contenir plusieurs lignes.

38
Robin Hsu

S'appuyant sur les bonnes réponses et commentaires de chacun, voici la version la plus courte et la plus douce:

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

1
rmanna

awk fonctionne bien si votre serveur l'a

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

Je suggérerais ce qui suit:

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

Aucun appel à un autre programme

0
Mathew P V