Cadena dividida en Bash
-
Uso del comando
tr
para dividir una cadena en Bash -
Uso de
IFS
para dividir una cadena en Bash -
Uso del comando
read
para dividir una cadena en Bash - Uso de la expansión de parámetros para dividir una cadena en Bash
-
Uso del comando
cut
para dividir una cadena en Bash
Este tutorial demuestra cómo dividir una cadena en un delimitador en bash usando el comando tr
, el IFS
, el comando read
, la expansión de parámetros y el comando cut
.
Uso del comando tr
para dividir una cadena en Bash
El comando tr
es una forma abreviada de traducir
. Traduce, elimina y comprime caracteres de la entrada estándar y escribe los resultados en la salida estándar.
Es un comando útil para manipular texto en la línea de comandos o en un script bash. Puede eliminar caracteres repetidos, convertir minúsculas a mayúsculas y reemplazar caracteres.
En el script de bash a continuación, el comando echo
canaliza la variable de cadena, $addrs
, al comando tr
, que divide la variable de cadena en un delimitador, -
. Una vez dividida la cadena, los valores se asignan a la variable IP
.
Luego, el bucle for
recorre la variable $IP
e imprime todos los valores usando el comando echo
.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
IP=$(echo $addrs | tr "-" "\n")
for ip in $IP
do
echo "$ip"
done
El resultado a continuación muestra que la variable de cadena $addr
se ha dividido en el delimitador, -
, en 4 cadenas independientes.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Uso de IFS
para dividir una cadena en Bash
IFS
son las siglas de Internal Field Separator.
El IFS
se utiliza para dividir palabras después de la expansión y para dividir líneas en palabras con el comando incorporado read
. El valor de IFS
le dice al shell cómo reconocer los límites de las palabras.
El valor predeterminado de IFS
es un espacio, una pestaña y una nueva línea. En el siguiente script, el valor original de IFS
se ha almacenado en la variable OIFS
y el nuevo valor de IFS
se ha establecido en -
.
Esto significa que el shell debe tratar -
, como el nuevo límite de la palabra. El shell divide la variable de cadena addrs
en -
y asigna los nuevos valores a la variable ips
.
Luego, el bucle for
recorre la variable $ips
e imprime todos los valores usando el comando echo
.
IFS=$OIFS
se usa para restaurar el valor original de la variable IFS
, y el OIFS no establecido
le dice al shell que elimine la variable OIFS
de la lista de variables de las que realiza un seguimiento.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
OIFS=$IFS
IFS='-'
ips=$addrs
for ip in $ips
do
echo "$ip"
done
IFS=$OIFS
unset OIFS
El resultado a continuación muestra que la variable de cadena $addr
se ha dividido en el delimitador, -
, en 4 cadenas independientes.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Uso del comando read
para dividir una cadena en Bash
El comando read
es un comando integrado en los sistemas Linux.
Se utiliza para leer el contenido de una línea en una variable. También divide las palabras de una cadena que se asigna a una variable de shell.
La cadena variable $addrs
se pasa al comando read
en el siguiente script. El IFS
establece el delimitador que actúa como un límite de palabra en la variable de cadena.
Esto significa que -
es la palabra límite en nuestro caso. La opción -a
le dice al comando read
que almacene las palabras que se han dividido en un array, mientras que la opción -r
le dice al comando read
que trate los caracteres de escape como son y no los interprete.
Las palabras que se han dividido se almacenan en el array IP
. El bucle for
recorre el array IP
e imprime todos los valores utilizando el comando echo
.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
IFS='-' read -ra IP <<< "$addrs"
for ip in "${IP[@]}";
do
echo "$ip"
done
De la salida a continuación, podemos observar que la variable de cadena $addr
se ha dividido en el delimitador, -
, en 4 cadenas separadas.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Uso de la expansión de parámetros para dividir una cadena en Bash
El siguiente script usa la expansión de parámetros para buscar y reemplazar caracteres. La sintaxis utilizada para la expansión de parámetros es ${variable//search/replace}
. Esto busca un patrón que coincida con search
en la variable
y lo reemplaza con replace
.
En nuestro caso, el script busca el patrón -
y lo reemplaza con un espacio en blanco. Los paréntesis alrededor de ${addrs//-/ }
se utilizan para definir un array de la nueva cadena, llamada ip_array
.
Usamos el bucle for
para iterar sobre todos los elementos de la variable ip_array
y mostrarlos usando el comando echo
.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_array=(${addrs//-/ })
for ip in "${ip_array[@]}"
do
echo "$ip"
done
La salida a continuación muestra todos los elementos en el ip_array
.
192.168.8.1
192.168.8.2
192.168.8.3
192.168.8.4
Podemos acceder a elementos individuales de la variable ip_array
pasando el índice. En el siguiente script, hemos pasado el índice 0
para hacer referencia al primer elemento del array.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_array=(${addrs//-/ })
printf "${ip_array[0]}\n"
La salida muestra el primer elemento de ip_array
.
192.168.8.1
Uso del comando cut
para dividir una cadena en Bash
El siguiente script utiliza el comando cut
para extraer una subcadena. La opción -d
especifica el delimitador que se utilizará para dividir la cadena en campos y la opción -f
establece el número del campo a extraer.
Pero la cadena se divide utilizando -
como delimitador, en nuestro caso, y para acceder al primer campo, pasamos el argumento 1
a la opción -f
, y hacemos lo mismo para acceder al segundo campo mediante pasando 2
a la opción -f
.
Los valores se asignan a las variables ip_one
e ip_two
, respectivamente. El comando printf
se utiliza para mostrar los valores de las variables.
#!/usr/bin/env bash
addrs="192.168.8.1-192.168.8.2-192.168.8.3-192.168.8.4"
ip_one=$(echo $addrs | cut -d '-' -f 1)
ip_two=$(echo $addrs | cut -d '-' -f 2)
printf "$ip_one\n$ip_two\n"
La siguiente salida muestra la primera y la segunda cadena divididas de la variable de cadena $addrs
.
192.168.8.1
192.168.8.2