Manejo Avanzado de Cadenas de Texto y Expansión de Variables en Bash
Cuando trabajas con variables en Bash, no solo puedes almacenar y acceder a valores, sino que también puedes manipular esas cadenas de texto de formas muy potentes y eficientes, a menudo sin necesidad de herramientas externas como grep
o sed
para tareas sencillas. Esto es gracias a las expansiones de parámetros o sustituciones de variables.
Extracción de Subcadenas
Puedes extraer una parte específica (subcadena) de una variable indicando la posición de inicio y, opcionalmente, la longitud.
- Sintaxis:
${variable:inicio:longitud}
inicio
: La posición del primer carácter a extraer (el primer carácter está en la posición 0).longitud
(opcional): Cuántos caracteres extraer desde elinicio
. Si se omite, extrae hasta el final de la cadena.
#!/bin/bash
MENSAJE="Hola Mundo Bash"
# Extraer los primeros 4 caracteres
echo "Primeros 4: ${MENSAJE:0:4}" # Salida: Hola
# Extraer desde el carácter 5 hasta el final (índice 5 es 'M')
echo "Desde el 5: ${MENSAJE:5}" # Salida: Mundo Bash
# Extraer 5 caracteres desde la posición 5
echo "5 desde el 5: ${MENSAJE:5:5}" # Salida: Mundo
# Extraer desde el final (usando números negativos)
# Nota: La sintaxis puede variar si la versión de Bash es muy antigua.
echo "Últimos 4: ${MENSAJE: -4}" # Salida: Bash (hay un espacio antes del -4)
Longitud de Cadena
Para saber cuántos caracteres tiene una cadena, usa el símbolo #
antes del nombre de la variable.
- Sintaxis:
${#variable}
#!/bin/bash
NOMBRE="Programación"
echo "La longitud de '$NOMBRE' es: ${#NOMBRE}"
# Salida: La longitud de 'Programación' es: 12
Sustitución de Patrones y Caracteres
Puedes reemplazar partes de una cadena por otra, o eliminar patrones específicos.
- Sustitución de la primera ocurrencia:
${variable/patrón/reemplazo}
- Sustitución de todas las ocurrencias:
${variable//patrón/reemplazo}
#!/bin/bash
TEXTO="Este es un texto con texto repetido."
# Reemplazar la primera ocurrencia de "texto" por "ejemplo"
echo "Primera: ${TEXTO/texto/ejemplo}" # Salida: Este es un ejemplo con texto repetido.
# Reemplazar todas las ocurrencias de "texto" por "ejemplo"
echo "Todas: ${TEXTO//texto/ejemplo}" # Salida: Este es un ejemplo con ejemplo repetido.
# Eliminar todas las ocurrencias de "texto" (reemplazo vacío)
echo "Eliminar: ${TEXTO//texto/}" # Salida: Este es un con repetido.
Eliminar Prefijos y Sufijos
Estas expansiones son increíblemente útiles para limpiar rutas de archivos, URLs, o cualquier cadena que tenga una parte inicial (prefijo) o final (sufijo) que quieras quitar.
- Eliminar el prefijo más corto:
${variable#patrón}
(elimina el patrón más corto que coincide desde el inicio de la cadena). - Eliminar el prefijo más largo:
${variable##patrón}
(elimina el patrón más largo que coincide desde el inicio de la cadena). - Eliminar el sufijo más corto:
${variable%patrón}
(elimina el patrón más corto que coincide desde el final de la cadena). - Eliminar el sufijo más largo:
${variable%%patrón}
(elimina el patrón más largo que coincide desde el final de la cadena).
#!/bin/bash
ARCHIVO="documento.tar.gz"
RUTA="/home/usuario/documentos/archivo.txt"
# Eliminar el prefijo más corto (ruta hasta la primera /)
echo "Sin /home: ${RUTA#/home/}" # Salida: usuario/documentos/archivo.txt
# Eliminar el prefijo más largo (ruta hasta la última /)
echo "Solo nombre: ${RUTA##*/}" # Salida: archivo.txt
# Eliminar el sufijo más corto (desde el primer .)
echo "Sin .tar.gz: ${ARCHIVO%.*}" # Salida: documento.tar
# Eliminar el sufijo más largo (desde el último .)
echo "Sin .gz: ${ARCHIVO%%.*}" # Salida: documento
Nota: Estos patrones usan la misma lógica de "wildcards" o "globbing" del shell (como *
, ?
, []
), NO son expresiones regulares.