Afficher le fichier avec les couleurs ANSI

12

J'ai un fichier aux couleurs ANSI.

test.txt:
\e[0;31mExample\e[0m

Je voudrais afficher le contenu de ce fichier dans un terminal, comme le catfait, mais je voudrais également afficher les couleurs.

Bob Dylan
la source
4
À l'aide less -R, par exemple.
Thomas Dickey
Qu'est-ce que votre catimpression?
techraf
1
La question d'OP avait trop de réponses possibles pour être intéressante. Commencez par echo -e $(cat test.txt).
Thomas Dickey

Réponses:

10

Je cherchais une solution à cette question bash exacte. J'ai failli manquer le commentaire de @Thomas Dickey qui m'a fourni la solution la plus élégante.

echo -e $(cat test.txt)

Certaines choses qui n'ont pas fonctionné pour moi sont (apparemment, vous ne pouvez pas faire écho aux choses)

cat test.txt | echo -e

ou

less -R test.txt

Un autre problème que j'avais était que echo -e n'imprimait pas bien les retours à la ligne et les espaces blancs contigus dans le fichier. Pour les imprimer, j'ai utilisé ce qui suit.

echo -ne $(cat test.txt | sed  's/$/\\n/' | sed 's/ /\\a /g')

Cela fonctionne pour un fichier test.txt contenant

\e[0;31mExa         mple\e[0m
\e[0;31mExample line2\e[0m
Peur
la source
Bonne réponse, mais \asonne la cloche pour moi. J'ai changé votre deuxième commande sed sed 's/ /\\033\\a /g'qui ne sonne pas.
faucon
1
Après des tests supplémentaires et la découverte de plus d'incohérences dans différents programmes terminaux (iTerm, Atom / nuclide), j'ai trouvé préférable de simplement mettre $(cat file.txt)des guillemets doubles et d'ajouter une nouvelle ligne à la fin - pas besoin de sed - donc: echo -ne "$(<file.txt)" \\nou echo -ne "$(cat <<"EOF" . . . EOF)" \\n. Cela empêche également bash d'effectuer une expansion globale dans le texte.
faucon
1

Si vous ne voyez pas de couleur, catles caractères de contrôle ne sont probablement pas intacts.

Certains outils suppriment les caractères de contrôle mais laissent en queue de ligne.

Comparer:

 echo -e "\e[0;31mExample\e[0m foo"

à

 echo -e "[0;31mExample[0m foo" 

Vous pourriez être en mesure de reconstruire la séquence de contrôle à partir de ce qui reste, bien que ce ne soit pas à toute épreuve car l'expression régulière que vous utilisez peut accidentellement extraire des séquences de caractères involontaires, etc. Mais par exemple:

echo -e "[0;31mExample[0m foo" | sed "s:\[\([0-9]*[;m]\):^[[\1:g"

restaurerait la couleur de la chaîne d'exemple.

Catskul
la source
-1

Cela devrait fonctionner par défaut. Par exemple, si je le fais ls --color=always > /tmp/aet que cat /tmp/a, je vois les couleurs. La vérification avec odconfirme que le fichier utilise les couleurs ANSI.

Je pense donc que vous devriez vérifier si votre terminal prend en charge les couleurs ANSI (et elles sont activées).

Giacomo Catenazzi
la source
1
Cela n'a pas répondu à la question.
Thomas Dickey
1
Non. -R a en fait résolu le problème pour moi.
Ken Ingram