printf con acentos en bash
Publicado: 2023-01-30Existe 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.