Apuntes bash

No es un bug, es una característica del shell.

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 el inicio. 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.

TOP