J'utilise (GNU) fmt
pour formater des textes plus longs avec de belles sauts de ligne («optimaux»). Toutefois, si le texte contient des séquences d'échappement de couleur ANSI (qui ne sont jamais affichées et ne servent qu'à colorier le texte lors de l'affichage), fmt
les considère comme des caractères normaux et calcule les longueurs de ligne incorrectes.Comment masquer les codes d'échappement couleur ANSI de fmt
Je ne suis pas sûr de savoir comment les caractères d'échappement littéraux fonctionnent ici, donc voici un exemple simple utilisant grep
pour générer les séquences ANSI. Commençons par une longue chaîne à formater.
string="Here’s an example of a rather long \
string with quite a few words in the middle \
that grep chooses to colour red."
Si nous ne mettons en évidence les grep
matches, tout fonctionne bien:
echo $string | grep --color=no i | fmt -w 50
Mais si nous mettons en évidence/les couleur, fmt
considère les lignes contenant la lettre « i » être beaucoup plus qu'ils sont réellement, et ils sont montrés comme des lignes plutôt courtes lorsqu'elles sont affichées dans un terminal.
echo $string | grep --color=yes i | fmt -w 50
Y at-il un moyen d'éviter cela? Pour cet exemple, je pourrais bien sûr utiliser fmt
avantgrep
, mais lorsque la chaîne de recherche s'étend sur plusieurs mots, cela ne fonctionne pas.
Merci. C'est la solution que j'ai fini par utiliser. En réalité, j'utilise 'sed' au lieu de' grep'. Fondamentalement, je convertis les balises (comme '|' dans 'c'est un exemple | string') en séquences de couleurs ANSI pour colorer les mots qu'elles couvrent. Utiliser 'fmt' avant le remplacement n'est pas optimal, car les balises occupent de l'espace, ce qui affecte le retour à la ligne, mais ce n'est pas trop grave à moins qu'une ligne contienne beaucoup de balises, et c'est mieux que fmt après remplacement (comme les séquences d'échappement ANSI prennent beaucoup plus de caractères). –