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 ^[[37m
e ^[[0m
fazem 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
(GNUsed
não suporta alternativas\e
e\033
)\[
é o segundo caractere da sequência de escape[0-9;]*
é o(s) valor(es) da cor regexm
é 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 sed
não suporta caracteres especiais \e
como 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 m
especí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 gcc
erro/aviso. Não esqueça de redirecionar gcc 2>&1 | sed...
.
Usandoperl
A versão sed
instalada em alguns sistemas operacionais pode ser limitada (por exemplo, macOS). O comando perl
tem 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 sed
linha 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 ANSIcol -b
: remover^H
ou^M
atualização: sobre col handle tabs e space //mencionado por @DanielF
〇. sobre col
lidar com espaços e tabulações
col -bx
substitua '\ t' por ' ',
col -bh
substitua ' ' por '\ t'.
// parece que col
nã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 col
não é possível manter espaços e tabulações como estão.
Responder4
O que é exibido como ^[
estánão ^
e [
; é o ESC
caractere ASCII, produzido por Escou Ctrl[(a ^
notação significa a tecla Ctrl).
ESC
é 0x1B hexadecimal ou 033 octal, então você deve usar \x1B
or \033
em suas regexes:
perl -pe 's/\033\[37m//g; s/\033[0m//g'
perl -pe 's/\033\[\d*(;\d*)*m//g'