Comment compter le nombre de mots de la chaîne en utilisant shell
Je veux compter le nombre de mots d'une chaîne en utilisant Shell.
Supposons que la chaîne soit:
input="Count from this String"
Ici, le délimiteur est l'espace ' '
et la sortie attendue est 4.
Il peut également y avoir des caractères d'espace de fin dans la chaîne d'entrée comme "Count from this String "
.
S'il y a de l'espace de fin dans la chaîne, elle devrait produire la même sortie, c'est-à-dire 4. Comment puis-je faire cela?
6 réponses
echo "$input" | wc -w
Utilisez wc-w pour compter le nombre de mots.
Ou selon la suggestion de dogbane, l'écho peut également être éliminé:
wc -w <<< "$input"
Si
wc -w << END_OF_INPUT
$input
END_OF_INPUT
Vous n'avez pas besoin d'une commande externe comme wc
car vous pouvez le faire en pur bash
ce qui est plus efficace.
Convertissez la chaîne en un tableau, puis comptez les éléments du tableau:
$ input="Count from this String "
$ words=( $input )
$ echo ${#words[@]}
4
Vous pouvez également utiliser set
pour définir des paramètres de position, puis les Compter:
$ input="Count from this String "
$ set -- $input
$ echo $#
4
Pour le faire en pur bash en évitant les effets secondaires, faites-le dans un sous-shell:
$ input="Count from this string "
$ echo $(IFS=' '; set -f; set -- $input; echo $#)
4
Cela fonctionne aussi avec d'autres séparateurs:
$ input="dog,cat,snake,billy goat,horse"
$ echo $(IFS=,; set -f; set -- $input; echo $#)
5
$ echo $(IFS=' '; set -f; set -- $input; echo $#)
2
Notez l'utilisation de "set-f" qui désactive Bash filename expansion dans le sous-shell, donc si l'appelant veut une expansion, il doit être fait à l'avance (Hat Tip @mkelement0).
Essayez le One-liner suivant:
echo $(c() { echo $#; }; c $input)
Il définit fondamentalement la fonction c()
et passe $input
comme argument, puis $#
renvoie le nombre d'éléments dans l'argument séparés par des espaces. Pour modifier le délimiteur, vous pouvez modifier IFS
(une variable spéciale).
Je vais juste jouer avec un one-liner perl (en évitant 'l'utilisation inutile de echo'):
perl -lane 'print scalar(@F)' <<< $input