2009-07-12 4 views
5

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 fmtavantgrep, mais lorsque la chaîne de recherche s'étend sur plusieurs mots, cela ne fonctionne pas.

Répondre

5

Il ne semble pas y avoir de bon moyen de résoudre cela en utilisant grep et fmt. Je vous recommande d'exécuter fmt en premier, puis d'utiliser sed au lieu de grep pour la recherche. Par exemple:

echo The search string will be highlighted red. | fmt -w 50 | sed ":a;$!N;$!ba;s/search[ \n]string/\x1b\[1;31m&\x1b\[0m/g"
+0

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). –

0

L'utilisation de `grep --colour = auto 'résoudrait le problème.

+0

Non, ce ne serait pas le cas. L'utilisation de 'grep --colour = auto' a le même résultat que l'utilisation de' grep --colour = no' dans cet exemple. –

Questions connexes