printf con acentos en bash

Publicado: 2023-01-30

Existe un ligero problema al tratar de imprimir acentos en bash. Por ejemplo, si trato de imprimir las siguientes líneas con una longitud fija de 30, tengo lo siguiente:

| Anime                         |
| Caricaturas                   |
| Cursos                        |
| Películas                    |
| Películas [Asiáticas]       |
| Series                        |

Cuando el comando que ejecuté fue:

printf "%-30s" "$directorio"

Lo que sale a relucir es que en la cadena “Películas” hay un acento, y en la cadena “Películas [Asiáticas]” hay dos acentos. Es decir, dado que pertenecen a un alfabeto extendido, esos caracteres ocupan dos espacios cada uno, lo que termina reduciendo lo que se imprime a pantalla.

Como mi problema es por una “á” y una “í”, hice lo siguiente:

# Para calcular la cantidad de espacios comidos por los acentos.
len_dir=30
if [[ "$directorio" == *"á"* ]]; then
	let "len_dir+=1"
fi
if [[ "$directorio" == *"í"* ]]; then
	let "len_dir+=1"
fi
# Impresión del nombre de la biblioteca.
printf "%-*s" "$len_dir" "$directorio"

Es decir, busqué en mis cadenas una “á” y, si existía, le sumo uno al 30. También busco una “í”, y si existe le sumo uno más. Por supuesto, esto no es una solución genérica, pues solo resuelve mi problema inmediato.

Pero, si estás en un problema similar, puedes contar los caracteres foráneos que son de tu interés, y agregarlas a una variable que guarde el “ancho variable pero fijo”, y sustituir el:

printf "%-30s" "$biblioteca"

por un:

printf "%-*s" "$len_dir" "$directorio"

donde se deben enviar dos argumentos: la longitud y la cadena a imprimir.

Aunque no es exactamente una solución… se resuelve el problema.

¿Tienes algún comentario?

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *