¿Cómo dividir una cadena en múltiples variables en bash shell? [duplicar]

Resuelto crunchybutternut asked hace 12 años • 5 respuestas

Estuve buscando una solución y encontré preguntas similares, solo que intentaban dividir oraciones con espacios entre ellas y las respuestas no funcionan para mi situación.

Actualmente, se está configurando una variable en una cadena como esta:
ABCDE-123456
y me gustaría dividirla en 2 variables, eliminando al mismo tiempo el " - ". es decir:
var1=ABCDE
var2=123456

¿Cómo es posible lograr esto?


Esta es la solución que funcionó para mí:
var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

¿Es posible utilizar el comando de corte que funcionará sin un delimitador (cada carácter se establece como una variable)?

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

crunchybutternut avatar May 09 '12 23:05 crunchybutternut
Aceptado

Para dividir una cadena separada por -, puedes usar readwith IFS:

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

Editar:

Así es como puedes leer cada carácter individual en elementos de matriz:

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

Volcar la matriz:

$ 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")'

Si hay espacios en la cadena:

$ IFS=$'\v' read -ra 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")'
Dennis Williamson avatar May 10 '2012 03:05 Dennis Williamson

Si sabe que serán solo dos campos, puede omitir los subprocesos adicionales como este, usando:

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

¿Qué hace esto? ${STR%-*}elimina la subcadena más corta $STRque coincide con el patrón -*comenzando desde el final de la cadena. ${STR#*-}Hace lo mismo, pero con el *-patrón y empezando desde el principio de la cuerda. Cada uno de ellos tiene contrapartes %%y ##cuál encuentra el patrón anclado más largo que coincida. Si alguien tiene una mnemónica útil para recordar cuál hace cuál, ¡hágamelo saber! Siempre tengo que probar ambos para recordar.

Consulte la documentación de bash para obtener más información.

Matt K avatar May 09 '2012 17:05 Matt K

Si su solución no tiene que ser general, es decir, solo necesita funcionar para cadenas como en su ejemplo, puede hacer:

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

Elegí cutaquí porque simplemente podrías extender el código para algunas variables más...

Rob I avatar May 09 '2012 17:05 Rob I

Suena como un trabajo para setuna costumbre IFS.

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

(Querrá hacer esto en una función con a local IFSpara no estropear otras partes de su secuencia de comandos donde necesita IFSser lo que espera).

tripleee avatar May 09 '2012 17:05 tripleee