147 votes

Comment diviser une chaîne en plusieurs variables dans un shell bash?

J'ai été à la recherche d'une solution et a trouvé des questions similaires, seulement ils ont tenté de diviser les phrases avec des espaces entre eux, et les réponses ne fonctionne pas pour ma situation.

Actuellement, une variable est définie à quelque chose d'une chaîne de caractères comme ceci:
ABCDE-123456
et je tiens à les diviser en 2 variables, tout en éliminant le "-". c'est à dire:
var1=ABCDE
var2=123456

Comment est-il possible d'accomplir cette?


C'est la solution qui a fonctionné pour moi:
var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

Est-il possible d'utiliser la coupe de la commande de travail sans un délimiteur (chaque personnage est défini comme une variable)?

var1=$(echo $STR | cut -f1 -d?)
var2=$(echo $STR | cut -f1 -d?)
var3=$(echo $STR | cut -f1 -d?)
etc.

181voto

Dennis Williamson Points 105818

read avec IFS sont parfaits pour cela:

 $ IFS=- read var1 var2 <<< ABCDE-123456
$ echo "$var1"
ABCDE
$ echo "$var2"
123456
 

Modifier:

Voici comment vous pouvez lire chaque caractère individuel dans des éléments de tableau:

 $ read -a foo <<<"$(echo "ABCDE-123456" | sed 's/./& /g')"
 

Dump le tableau:

 $ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]="-" [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'
 

S'il y a des espaces dans la chaîne:

 $ IFS=$'\v' read -a foo <<<"$(echo "ABCDE 123456" | sed 's/./&\v/g')"
$ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]=" " [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'
 

155voto

mkb Points 7558

Si vous savez qu'il ne s'agira que de deux champs, vous pouvez ignorer les sous-processus supplémentaires comme ceci:

 var1=${STR%-*}
var2=${STR#*-}
 

144voto

Rob I Points 2750

Si votre solution ne doit pas nécessairement être générale, c'est-à-dire ne doit fonctionner que pour des chaînes telles que votre exemple, vous pouvez effectuer les opérations suivantes:

 var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)
 

J'ai choisi cut ici parce que vous pourriez simplement étendre le code pour un peu plus de variables ...

42voto

tripleee Points 28746

Cela ressemble à un travail pour set avec une personnalisation IFS .

 IFS=-
set $STR
var1=$1
var2=$2
 

(Vous voudrez faire cela dans une fonction avec local IFS afin de ne pas gâcher les autres parties de votre script où vous avez besoin de IFS pour être ce que vous attendez.)

16voto

Archibald Points 150
string="ABCDE-123456"
IFS=- # use "local IFS=-" inside the function
set $string
echo $1 # >>> ABCDE
echo $2 # >>> 123456

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