939 votes

bash scinde une chaîne en un tableau

Dans un script bash, je voudrais diviser une ligne en morceaux et les mettre dans un tableau.

La ligne:

Paris, France, Europe

Je voudrais avoir dans un tableau, comme ceci:

array[0] = Paris
array[1] = France
array[2] = Europe

Je voudrais utiliser un code simple, la commande de vitesse n'a pas d'importance. Des idées?

1513voto

Dennis Williamson Points 105818
IFS=', ' read -a array <<< "$string"

Pour accéder à un élément:

echo "${array[0]}"

Pour effectuer une itération sur les éléments:

for element in "${array[@]}"
do
    echo "$element"
done

Pour obtenir à la fois l'indice et la valeur de:

for index in "${!array[@]}"
do
    echo "$index ${array[index]}"
done

Le dernier exemple est utile parce que Bash tableaux sont rares. En d'autres termes, vous pouvez supprimer un élément ou d'ajouter un élément, puis les indices ne sont pas contigus.

unset "array[1]"
array[42]=Earth

Pour obtenir le nombre d'éléments dans un tableau:

echo "${#array[@]}"

Comme mentionné ci-dessus, les tableaux peuvent être dispersés de sorte que vous ne devriez pas utiliser la longueur pour obtenir le dernier élément. Voici comment vous pouvez en Bash 4.2 et versions ultérieures:

echo "${array[-1]}"

dans la version de Bash (à partir de quelque part après 2.05 b):

echo "$array[@]: -1:1}

Les grands décalages négatifs sélectionnez plus loin à partir de la fin du tableau. Remarque l'espace avant le signe moins dans la forme plus ancienne. Il est requis.

258voto

Jim Ho Points 576

Voici une façon sans réglage de l'IFS:

string="1:2:3:4:5"
array=(${string//:/ })
for i in "${!array[@]}"
do
    echo "$i=>${array[i]}"
done

L'idée est d'utiliser la chaîne de remplacement:

${string//substring/replacement}

pour remplacer tous les matchs de $sous-chaine avec des espaces, et puis en utilisant la substitution de la chaîne d'initialiser un tableau:

(element1 element2 ... elementN)

32voto

Luca Borrione Points 3038

Parfois, il m'est arrivé que la méthode décrite dans l'acceptation de réponse n'a pas de travail, surtout si le séparateur est un retour chariot.
Dans ces cas, j'ai résolu de cette façon:

string='first line
second line
third line'

oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1} # this is useful to format your code with tabs
lines=( $string )
IFS="$oldIFS"

for line in "${lines[@]}"
    do
        echo "--> $line"
done

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