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 echo
s 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"
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}'
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"
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.
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
awk fonctionne bien si votre serveur l'a
var="text,text,text,text"
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"
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