300 votes

Comment diviser une chaîne en plusieurs chaînes dans le shell bash?

J'ai une chaîne, comme une phrase, et je sais avec certitude qu'il y a beaucoup de mots avec au moins un espace séparés tous les deux adjacents. Comment puis-je diviser les mots en chaînes individuelles pour pouvoir les parcourir en boucle?


EDIT: Bash La chaîne est transmise en tant qu'argument. Par exemple, $ {2} peut être un "fichier chat". Alors, comment puis-je parcourir cet argument $ {2}?


Aussi, comment vérifier si une chaîne contient des espaces?

385voto

Highwind Points 401

J'aime la conversion d'un tableau, pour être en mesure d'accéder aux différents éléments:

    sentence="this is a story"
    stringarray=($sentence)

maintenant, vous pouvez accéder aux éléments individuels directement (on commence à 0):

    echo ${stringarray[0]}

ou de convertir des chaînes de caractères afin de boucle:

    for i in "${stringarray[@]}"
    do
      :
      # do whatever on $i
    done

Bien sûr, une boucle dans la chaîne directement a répondu avant, mais cette réponse a le désavantage de ne pas garder une trace de l'individu éléments pour les utiliser plus tard:

    for i in $sentence
    do
      :
      # do whatever on $i
    done

Voir aussi Bash Tableau de Référence

325voto

mob Points 61524

Avez-vous essayé de passer simplement la variable chaîne à une boucle for ? Bash, pour sa part, se scinde automatiquement sur les espaces blancs.

 sentence="This is   a sentence."
for word in $sentence
do
    echo $word
done
 

 This
is
a
sentence.
 

97voto

Idelic Points 4196

Il suffit d’utiliser les "coquilles" intégrées. Par exemple,

set $ text

Après cela, les mots individuels dans $ text seront dans $ 1, $ 2, $ 3, etc. Pour la robustesse, on fait habituellement

set - junk $ text
décalage

pour gérer le cas où $ text est vide ou commencer par un tiret. Par exemple:

text = "Ceci est un test"
set - junk $ text
décalage
pour mot; faire
  echo "[$ word]"
terminé

Cette imprime

[Ce]
[est]
[une]
[tester]

48voto

DVK Points 63282
 $ echo "This is   a sentence." | tr -s " " "\012"
This
is
a
sentence.
 

Pour vérifier les espaces, utilisez grep:

 $ echo "This is   a sentence." | grep " " > /dev/null
$ echo $?
0
$ echo "Thisisasentence." | grep " " > /dev/null     
$ echo $?
1
 

20voto

Luca Borrione Points 3038

(A) Pour diviser une phrase dans ses mots (séparés par un espace), vous pouvez simplement utiliser la valeur par défaut FI en utilisant

array=( $string )


Exemple de l'exécution de l'extrait de code suivant

#!/bin/bash

sentence="this is the \"sentence\"   'you' want to split"
words=( $sentence )

len="${#words[@]}"
echo "words counted: $len"

printf "%s\n" "${words[@]}" ## print array

seront de sortie

words counted: 8
this
is
the
"sentence"
'you'
want
to
split

Comme vous pouvez le voir, vous pouvez utiliser des guillemets simples ou doubles sans aucun problème

Notes:
-- c'est fondamentalement la même de mob's réponse, mais de cette façon, vous stocker le tableau pour tout autre besoin. Si vous avez seulement besoin d'une seule boucle, vous pouvez utiliser sa réponse, qui est une ligne plus courte :)
-- veuillez vous référer à cette question pour d'autres méthodes pour diviser une chaîne basée sur délimiteur.


(B) pour rechercher un caractère dans une chaîne, vous pouvez également utiliser une expression régulière.
Exemple, pour vérifier la présence d'un espace de caractère que vous pouvez utiliser:

regex='\s{1,}'
if [[ "$sentence" =~ $regex ]]
    then
        echo "Space here!";
fi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X