[bash] printf ou l'art de justifier des caractères spéciaux
Bonjour à tous,
Je me suis inscrit aujourd'hui au forum pour vous poser une question qui m'occupe depuis déjà quelques heures.
Mon problème est simple : je veux pouvoir justifier du texte au milieu de mon terminal.
Pour résoudre ce problème, j'ai rencontré la solution
Code:
printf '%*b\n' $(( ($COLUMNS+${#montexte})/2 )) "$montexte"
dont je comprends la syntaxe.
Tout se passe bien, mon 'ASCII art' pour commencer ma banner ssh (motd) se justifie correctement, mais alors survient le problème : dans une conditionnelle (if then), je veux afficher un message d'alerte si l'utilisateur est sudoer, et j'ai la bonne idée d'utiliser l'encodage ANSI (pour mes couleurs et effets, par exemple \e[0m).
L'option b de printf me permet d'interpréter correctement la chaine (ie met en pratique les couleurs/effets), mais le problème est la longueur faussée de la chaine : des caractères invisibles (de style je suppose) sont comptés avec ${#montexte}.
J'ai pu découvrir avec
Code:
echo -e $montexte | cat -v
que '\e[0m' semble devenir '^[[0m', et j'ai donc essayé de supprimer ces caractères dans la chaine, au moins pour avoir la longueur (ensuite je les affichent pour avoir le style, hein) :
Code:
echo -e $montexte | sed -E 's:\^\[\[[0-9]+m::g'
Bon ici tout vas bien, mais ce qui m'as fait craquer, c'est printf : la substition des caractères spéciaux semble différente. En effet, la longueur semblait totalement aléatoire pour arriver à un texte centré (sachant que printf attends la longueur de la chaine, qu'il complète au début par des espaces).
J'ai vraiment besoin de votre aide, rien ne se trouve sur Internet à ma connaissance. :calim2:
Bonne journée à vous,
Merci d'avance !