Programme qui transmet STDIN à STDOUT avec les codes de couleur supprimés?


64

J'ai une commande qui produit une sortie en couleur et j'aimerais la canaliser dans un fichier avec les codes de couleur supprimés. Existe-t-il une commande qui fonctionne comme catcelle-ci, sauf qu'elle supprime les codes de couleur? Je prévois de faire quelque chose comme ça:

$ command-that-produces-colored-output | stripcolorcodes > outfile

4
Il se peut qu’un programme produise une sortie colorée alors même que cette sortie est redirigée vers un fichier et ne permet pas de la désactiver. Je m'attendrais à ce que tout programme qui colore sa sortie soit vérifié isatty(stdin)avant de le faire. L'esprit de partager quel est ce programme?
alex

passez le cat- un test rapide que j’ai grep --color=auto myusername /etc/passwdfait me donne mon nom d’utilisateur en rouge avec du texte blanc grep --color=auto myusername /etc/passwd | catme donne du texte blanc clair
ivanivan

1
Ce n'est pas une solution. Cela ne fonctionne que parce que cela grep --color=autoévite de produire une sortie colorée lorsque la sortie standard n'est pas un terminal. Je parle d'une commande qui génère sans condition des codes de couleur. (Comme le souligne alex ci-dessus, un tel comportement est sans doute un bug, mais nous avons parfois besoin de travailler avec des logiciels imparfaits que nous ne pouvons pas résoudre nous-mêmes, et c'est de cela que traite cette question.)
Ryan Thompson

Réponses:


59

Vous penseriez qu'il y aurait un utilitaire pour cela, mais je ne l'ai pas trouvé. Cependant, ce one-liner Perl devrait faire l'affaire:

perl -pe 's/\e\[?.*?[\@-~]//g'

Exemple:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

Ou, si vous voulez un script, vous pouvez enregistrer en tant que stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

Si vous souhaitez supprimer uniquement les codes de couleur et laisser les autres codes ANSI (tels que le mouvement du curseur), utilisez

s/\e\[[\d;]*m//g;

au lieu de la substitution que j'ai utilisée ci-dessus (qui supprime tous les codes d'échappement ANSI).


9
Comme mentionné dans un commentaire à une autre réponse ( unix.stackexchange.com/questions/4527/… ), cette expression régulière a été extraite Term::ANSIColor. Reconnaissez vos sources, s'il vous plaît!
Forivall

2
reconnaissez vos sources!
Jürgen Paul

29

Supprimer les codes de couleur (caractères spéciaux) avec GNU sed

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

Ou

Supprimer les séquences d'échappement ANSI en Python

Installez le paquet colorama python ( pip install colorama). Mettre dans stripcolorcodes:

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

Courez chmod +x stripcolorcodes.


C'est génial. Exactement ce dont j'avais besoin!
Adivis12

Le Python est un peu lent mais sedc'est impressionnant :)

2
Je n'ai pas essayé le python, mais la version sed ne supprime pas toutes les couleurs. (Je n'ai pas effectué de test exhaustif, mais certaines couleurs d'arrière-plan sont restées intactes. J'ai donc opté pour l'option perl plus rapide.)
scié

22

Si vous pouvez installer le module Term :: ANSIColor , ce script Perl fonctionne:

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;

5
C'est en fait là que j'ai obtenu cette regex avec codes de couleur seulement. Mais installer un module entier juste pour cette expression rationnelle est un peu compliqué.
cjm

4
Meh, si vous configurez correctement cpanm, il installe le module en 5 secondes environ.
Ryan Thompson

Il n'est pas nécessaire d'écrire le script dans le fichier. Just pipe in:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick

10

Si votre système a accès à NodeJS, vous pouvez installer le package de nœud suivant strip-ansi-cli.

$ npm install -g strip-ansi-cli

Vous pouvez ensuite exécuter votre commande comme suit:

$ command-that-produces-colored-output | strip-ansi > outfile

1
NodeJS est une dépendance énorme, quand il existe des solutions qui peuvent utiliser des langages et des outils déjà présents dans la plupart des systèmes.
user137369

En outre, c'est la plus lente solution décrite (voir ici ) et vous avez probablement vous remarquerez la différence.

3

Cette commande sed l'a fait pour moi:

sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g"

Exemple:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile

Cela ne semble pas fonctionner avec la dernière version de sed.

3

Vous pouvez utiliser ac pour cela. Il devrait être plus rapide que tout ce qui est énuméré ci-dessus (bien que perlet seddevrait être décent). Voici un exemple:

curl -s wttr.in/LA | ac -s

A titre de non-responsabilité: la fonctionnalité de filtrage des couleurs a été écrite par moi.


3
un lien vers 'ac' serait utile. ;)
Vitaly Kushner

Le acprogramme semble être ici: hub.darcs.net/vmchale/fastcat
Michael Burr le

1
$ command-that-produces-colored-output | ansifilter

... et si nécessaire (dnf, ...) install ansifilter

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.