Programma che passa STDIN a STDOUT con i codici colore rimossi?


64

Ho un comando che produce output a colori e vorrei reindirizzarlo in un file con i codici colore eliminati. Esiste un comando che funziona come catse non fosse che rimuove i codici colore? Ho intenzione di fare qualcosa del genere:

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

4
Potrebbe essere un bug che un programma produca un output colorato anche se il suo output viene reindirizzato a un file e non fornisce un'opzione per disattivarlo. Mi aspetto che ogni programma che colora il suo output venga verificato isatty(stdin)prima di farlo. Ti va di condividere cos'è questo programma?
alex

passalo attraverso cat- test rapido che ho eseguito grep --color=auto myusername /etc/passwdmi dà il mio nome utente in rosso con testo bianco elsewhree. grep --color=auto myusername /etc/passwd | catmi dà un semplice testo bianco
ivanivan,

1
Questa non è una soluzione. Funziona solo perché grep --color=autoevita di produrre output colorati quando l'output standard non è un terminale. Sto parlando di un comando che genera incondizionatamente codici colore. (Come sottolinea Alex, tale comportamento è probabilmente un bug, ma a volte abbiamo bisogno di lavorare con software imperfetto che non possiamo facilmente risolvere da soli, ed è di questo che tratta questa domanda.)
Ryan Thompson

Risposte:


59

Penseresti che ci sarebbe un'utilità per quello, ma non sono riuscito a trovarlo. Tuttavia, questo Perl one-liner dovrebbe fare il trucco:

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

Esempio:

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

Oppure, se si desidera uno script, è possibile salvare come stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

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

Se si desidera eliminare solo i codici colore e lasciare soli altri codici ANSI (come il movimento del cursore), utilizzare

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

invece della sostituzione che ho usato sopra (che rimuove tutti i codici di escape ANSI).


9
Come menzionato in un commento a un'altra risposta ( unix.stackexchange.com/questions/4527/… ), questa regex è stata estratta Term::ANSIColor. Riconosci le tue fonti, per favore!
forivall

2
riconosci le tue fonti!
Jürgen Paul,

29

Rimuovi i codici colore (caratteri speciali) con GNU sed

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

O

Elimina le sequenze di escape ANSI in Python

Installa il pacchetto colorama python ( pip install colorama). Inserisci in stripcolorcodes:

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

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

Corri chmod +x stripcolorcodes.


Questo e spettacolare. Esattamente quello di cui avevo bisogno!
adivis12,

Il Python è un po 'lento ma sedè impressionante :)

2
Non ho provato Python, ma la versione sed non toglie tutti i colori. (Non ho effettuato un test esaustivo, ma ho lasciato intatti alcuni colori di sfondo, quindi sono andato con l'opzione perl più veloce.)
rsaw

22

Se è possibile installare il modulo Term :: ANSIColor , questo script perl funziona:

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

5
In realtà è lì che ho ottenuto quel regex con soli codici colore. Ma installare un intero modulo solo per quell'unica regex è un po 'troppo.
cjm,

4
Meh, se hai impostato correttamente cpanm, installa il modulo in circa 5 secondi.
Ryan Thompson,

Non è necessario scrivere lo script nel file. Basta inserire:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick il

10

Se il sistema ha accesso a NodeJS è possibile installare il seguente pacchetto Node, strip-ansi-cli.

$ npm install -g strip-ansi-cli

È quindi possibile eseguire il comando in questo modo:

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

1
NodeJS è un'enorme dipendenza, quando esistono soluzioni che possono usare linguaggi e strumenti già presenti nella maggior parte dei sistemi.
user137369

Inoltre, questa è la soluzione più lento elencati (vedi qui ) e probabilmente si nota la differenza.

3

Questo comando sed ha fatto per me:

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

Esempio:

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

Questo non sembra funzionare con l'ultima versione di sed.

3

Puoi usare ac per questo. Dovrebbe essere più veloce di qualsiasi cosa elencata sopra (sebbene perle seddovrebbe essere decente). Ecco un esempio:

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

Come disclaimer: la funzionalità di filtro colore è stata scritta da me.


3
un link a "ac" sarà utile. ;)
Vitaly Kushner il

Il acprogramma sembra essere qui: hub.darcs.net/vmchale/fastcat
Michael Burr

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

... e se necessario, (dnf, ...) install ansifilter

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.