Removendo códigos de cores da saída [duplicado]

14

Estou trabalhando em um script para trabalhar ao lado de um programa que estou escrevendo. O que estou tentando fazer é avaliar o nível de conclusão de um número de clientes usando outro script. Meu script faz exatamente o que eu quero, mas existem algumas constantes de cor que são inseridas na minha saída XML, o que atrapalha quando eu estou analisando o XML no PHP depois. Para encurtar a história, tenho uma expressão sed que estou usando, que remove a primeira parte das constantes de cor, mas não remove a seqüência de escape posterior, que parece com algo como ^ [(B - assim, meu problema.

Aqui está a sequência de sed que estou usando:

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

Eu estou querendo saber se há uma sequência separada de sed que eu poderia executar depois para remover a seqüência final. Eu tentei usar

sed 's/\^\[\(B//'

Mas não parece remover nada. Eu não preciso necessariamente de uma resposta, se alguém tiver um bom guia sobre sed e códigos de cores, isso também seria super útil. Eu pesquisei por aí, mas as respostas que encontrei parecem remover a porção de abertura da cor.

Obrigado pela sua ajuda.

    
por SamHuckaby 13.11.2012 / 00:02

2 respostas

25

Os códigos de escape ANSI começam com ESC ou caractere 3 Os códigos de cores (um subconjunto deles) são 3[Xm , onde X é uma lista de dígitos separados por ponto-e-vírgula, possivelmente vazia (significa redefinição). m é um literal m.

Como eu mesmo esqueço esses códigos, eu os "documentei" no link .

Quanto a uma expressão sed: procuraria s/\x1B\[[0-9;]*[JKmsu]//g

    
por 13.11.2012 / 00:13
3

Você pode fazer isso em Perl.

#!/usr/bin/env perl

# catch the output of some command
my $output = 'command';

# remove only color codes
$output =~ s/\e\[[\d;]*m//g;

# or remove all ANSI escape sequences
# $output =~ s/\e\[?.*?[\@-~]//g

print "$output","\n";
    
por 13.11.2012 / 00:52