ti-enxame.com

Programa que passa STDIN para STDOUT com códigos de cores despojados?

Eu tenho um comando que produz saída em cores e gostaria de inseri-lo em um arquivo com os códigos de cores removidos. Existe um comando que funciona como cat, exceto que retira os códigos de cores? Eu pretendo fazer algo assim:

$ command-that-produces-colored-output | stripcolorcodes > outfile
65
Ryan C. Thompson

Você pensaria que haveria um utilitário para isso, mas eu não consegui encontrá-lo. No entanto, este one-liner Perl deve fazer o truque:

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

Exemplo:

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

Ou, se você quiser um script, salve como stripcolorcodes:

#! /usr/bin/Perl

use strict;
use warnings;

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

Se você deseja remover somente códigos de cores e deixar outros códigos ANSI (como o movimento do cursor) em paz, use

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

em vez da substituição que usei acima (que remove todos os códigos de escape ANSI).

61
cjm

Remova os códigos de cores (caracteres especiais) com GNU sed

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

Ou

Tirar seqüências de escape ANSI em Python

Instale colorama python pacote (pip install colorama). Coloque em stripcolorcodes:

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

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

Corre chmod +x stripcolorcodes.

29
jfs

Se você pode instalar o módulo Term :: ANSIColor , este script Perl funcionará:

#!/usr/bin/env Perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;
22
Ryan C. Thompson

Se o seu sistema tiver acesso a NodeJS , você poderá instalar o seguinte Node pacote, strip-ansi-cli .

$ npm install -g strip-ansi-cli

Você pode executar seu comando da seguinte maneira:

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

Este comando sed fez isso por mim:

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

Exemplo:

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

Você pode usar ac para isso. Deve ser mais rápido do que qualquer coisa listada acima (embora Perl e sed devam ser decentes). Aqui está um exemplo:

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

Como um aviso: a funcionalidade de filtragem de cores foi escrita por mim.

3
user254560
$ command-that-produces-colored-output | ansifilter

... e se necessário, (dnf, ...) install ansifilter

2
JJoao