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.