Removendo códigos de cores ANSI do fluxo de texto

Removendo códigos de cores ANSI do fluxo de texto

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? Suponho que a melhor maneira seria canalizar a saída por meio de uma espécie de editor de fluxo.

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'

Responder1

Os personagens ^[[37me ^[[0mfazem parte doSequências de escape ANSI (códigos CSI). Veja tambémestas especificações.

Usando GNUsed

sed -e 's/\x1b\[[0-9;]*m//g'
  • \x1b(ou \x1B) é oescaparcaractere especial
    (GNU sednão suporta alternativas \ee \033)
  • \[é o segundo caractere da sequência de escape
  • [0-9;]*é o(s) valor(es) da cor regex
  • mé o último caractere da sequência de escape

Usando o padrão do macOSsed

Mikesugere:

sed -e $'s/\x1b\[[0-9;]*m//g'

O padrão do macOS sednão suporta caracteres especiais \ecomo apontado porslmevaporizador25nos comentários.

Para instalar gsed.

brew install gnu-sed

Exemplo com linha de comando do OP

(OP significa pôster original)

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

Melhorias

O sinalizador -eé opcional para GNU sed, mas obrigatório para o padrão do macOS sed:

sed 's/\x1b\[[0-9;]*m//g'           # Remove color sequences only

Tom Halesugere também remover todas as outras sequências de escape usando [a-zA-Z]em vez de apenas a letra mespecífica da sequência de escape do modo gráfico (cor):

sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'    # Remove all escape sequences

Mas [a-zA-Z]pode ser muito largo e remover muito.Michał FaleńskieMiguel Motaproponho remover apenas algumas sequências de escape usando [mGKH]e [mGKF]respectivamente.

sed 's/\x1b\[[0-9;]*[mGKH]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKHF]//g'     # Remove all
Last escape
sequence
character   Purpose
---------   -------------------------------
m           Graphics Rendition Mode (including color)
G           Horizontal cursor move
K           Horizontal deletion
H           New cursor position
F           Move cursor to previous n lines

Britton Kerinindica K(além de m) remove as cores de gccerro/aviso. Não esqueça de redirecionar gcc 2>&1 | sed....

Usandoperl

A versão sedinstalada em alguns sistemas operacionais pode ser limitada (por exemplo, macOS). O comando perltem a vantagem de ser geralmente mais fácil de instalar/atualizar em mais sistemas operacionais.Adam Katzsugere usar \e(o mesmo que \x1b) emPCRE.

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

perl -pe 's/\e\[[0-9;]*m//g'          # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick

Exemplo com linha de comando do OP:

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

Uso

Como apontado porStuart Cardallcomentário de, esta sedlinha de comando é usada pelo projetoBot ruim Nginx final(1000 estrelas) para limpar o relatório de e-mail ;-)

Responder2

Eu descobri um removedor de sequência de escape melhor se você estiver usando MacOS. Verifique isto:

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

Responder3

ansi2txt

https://unix.stackexchange.com/a/527259/116915

cat typescript | ansi2txt | col -b
  • ansi2txt: remova códigos de cores ANSI
  • col -b: remover ^Hou^M


atualização: sobre col handle tabs e space //mencionado por @DanielF

〇. sobre collidar com espaços e tabulações

col -bxsubstitua '\ t' por ' ', col -bhsubstitua ' ' por '\ t'.

// parece que colnão consigo manter o espaço/guias como estão, é uma pena.


0. string original

$ echo -e '        ff\tww' | hd
00000000  20 20 20 20 20 20 20 20  66 66 09 77 77 0a        |        ff.ww.|

1. -h repita os espaços para tabulação

$ echo -e '        ff\tww' | col -b | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bxh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|

2. -x repace a guia para espaços

$ echo -e '        ff\tww' | col -bx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|
$ echo -e '        ff\tww' | col -bhx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|

3. parece que colnão é possível manter espaços e tabulações como estão.

Responder4

O que é exibido como ^[estánão ^e [; é o ESCcaractere ASCII, produzido por Escou Ctrl[(a ^notação significa a tecla Ctrl).

ESCé 0x1B hexadecimal ou 033 octal, então você deve usar \x1Bor \033em suas regexes:

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

perl -pe 's/\033\[\d*(;\d*)*m//g'

informação relacionada