¿Cómo dividir una cadena en múltiples variables en bash shell? [duplicar]
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.
Para dividir una cadena separada por -
, puedes usar read
with 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")'
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 $STR
que 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.
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í cut
aquí porque simplemente podrías extender el código para algunas variables más...
Suena como un trabajo para set
una costumbre IFS
.
IFS=-
set $STR
var1=$1
var2=$2
(Querrá hacer esto en una función con a local IFS
para no estropear otras partes de su secuencia de comandos donde necesita IFS
ser lo que espera).