Cadena dividida en Bash

Fumbani Banda 30 enero 2023
  1. Uso del comando tr para dividir una cadena en Bash
  2. Uso de IFS para dividir una cadena en Bash
  3. Uso del comando read para dividir una cadena en Bash
  4. Uso de la expansión de parámetros para dividir una cadena en Bash
  5. Uso del comando cut para dividir una cadena en Bash
Cadena dividida 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
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub

Artículo relacionado - Bash String