Removendo códigos de cores ANSI do fluxo de texto

42

Examinando a saída de

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'

em um editor de texto (por exemplo, vi ) mostra o seguinte:

^[[37mABC
^[[0m

Como remover os códigos de cores ANSI do arquivo de saída? Eu suponho que o melhor caminho seria canalizar a saída através de um editor de fluxo de tipos.

O seguinte não funciona

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'
    
por user001 21.01.2012 / 02:01

8 respostas

58

Os caracteres ^[[37m e ^[[0m fazem parte das sequências ANSI Escape (códigos CSI) .
Veja também as especificações completas .

Usando sed

sed 's/\x1b\[[0-9;]*m//g'
  • \x1b é o caractere especial escape (igual a \x1B ou '\ 033')
  • \[ é o segundo caractere da declaração de cores
  • [0-9]* é o valor da cor
  • m é o último caractere da declaração de cores

Exemplo com a linha de comando OP * :

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | 
sed 's/\x1b\[[0-9;]*m//g'

Como mencionado na resposta de Tom Hale , você também pode remover outros comandos codificados. Este é um truque mais geral:

sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'

Usando perl

A versão de sed instalada em alguns sistemas operacionais pode ser limitada (por exemplo, MacOS X). O comando perl tem a vantagem de ser frequentemente mais fácil de instalar / atualizar em mais sistemas operacionais.

Escolha seu regex dependendo de quantos comandos você deseja filtrar:

perl -pe 's/\x1b\[[0-9;]*m//g'        # Just the colors
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
perl -pe 's/\x1b\[[0-9;]*[mGKH]//g'
perl -pe 's/\x1b\[[0-9;]*[a-zA-Z]//g'

Exemplo com a linha de comando OP * :

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | 
perl -pe 's/\x1b\[[0-9;]*m//g'

Uso

Como apontado pelo comentário de Stuart Cardall , esse truque é usado pelo projeto Ultimate Nginx Bad Bot (quase 200 estrelas) para limpar o relatório de e-mail ;-)

* OP : O riginal P oster

    
por 21.01.2012 / 02:40
16

Eu descobri um melhor removedor de seqüência de escape. Verifique isso:

perl -pe 's/\x1b\[[0-9;]*[mG]//g'

    
por 05.03.2013 / 14:24
8

O que é exibido como ^[ não é ^ e [ ; é o caractere ASCII ESC , produzido por Esc ou Ctrl [ (a notação ^ significa a tecla Ctrl).

ESC é 0x1B hexadecimal ou 033 octal, portanto, você precisa usar \x1B ou 3 em seus regexes:

perl -pe 's/3\[37m//g; s/3[0m//g'

perl -pe 's/3\[\d*(;\d*)*m//g'
    
por 21.01.2012 / 02:39
4

Se você preferir algo simples, pode usar o módulo strip-ansi (Node.js obrigatório):

$ npm install --global strip-ansi-cli

Em seguida, use-o da seguinte forma:

$ strip-ansi < colors.o

Ou apenas passe uma string:

$ strip-ansi '^[[37mABC^[[0m'
    
por 04.07.2014 / 14:44
2

A pergunta "respondida" não funcionou para mim, então criei este regex para remover as seqüências de escape produzidas pelo módulo perl Term :: ANSIColor.

cat colors.o | perl -pe 's/\x1b\[[^m]+m//g;

O regex do Grawity deve funcionar bem, mas o uso de + parece funcionar também.

    
por 13.03.2013 / 23:08
2

commandlinefu dá esta resposta que remove as cores ANSI e também os comandos de movimento:

sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"

Para apenas cores, você quer:

 sed "s,\x1B\[[0-9;]*m,,g"
    
por 26.04.2017 / 09:40
0

Eu tive um problema semelhante com a remoção de caracteres adicionados da coleta da saída superior interativa via massa e isso ajudou:

cat putty1.log | perl -pe 's/\x1b.*?[mGKH]//g'
    
por 03.07.2013 / 15:45
0

Isso é o que funcionou para mim (testado no Mac OS X)

perl -pe 's/\[[0-9;]*[mGKF]//g'
    
por 16.09.2017 / 02:01

Tags