Os caracteres ^[[37m
e ^[[0m
fazem parte das seqüências de escape ANSI (códigos CSI) . Veja também estas especificações .
Usando GNU sed
sed 's/\x1b\[[0-9;]*m//g'
\x1b
(ou \x1B
) é o caractere especial de escape
( sed
não suporta alternativas \e
e \033
)
\[
é o segundo caractere da sequência de escape
[0-9;]*
é o (s) valor (es) de cor regex
m
é o último caractere da sequência de escape
Mac No macOS, o sed
comando padrão não suporta caracteres especiais, como \e
indicado por slm e steamer25 nos comentários. Em vez disso, use gsed
que você pode instalar usando brew install gnu-sed
.
Exemplo com a 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'
Tom Hale sugere remover todas as outras seqüências de escape usando em [a-zA-Z]
vez da letra m
específica da seqüência de escape do modo de gráfico (cor). Mas [a-zA-Z]
pode ser muito largo e pode remover muito. Michał Faleński e Miguel Mota propõem remover apenas algumas seqüências de escape usando [mGKH]
e [mGKF]
respectivamente. Britton Kerin indica K
que também deve ser usado além de m
remover as cores de gcc
erro / aviso (não se esqueça de redirecionar gcc 2>&1 | sed...
).
sed 's/\x1b\[[0-9;]*m//g' # Remove color sequences only
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' # Remove all escape sequences
sed 's/\x1b\[[0-9;]*[mGKH]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g' # Remove color and move sequences
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
Usando perl
A versão do 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 Katz sugere usar \e
(o mesmo que \x1b
) no PCRE .
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 a 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
Conforme apontado pelo comentário de Stuart Cardall , essa sed
linha de comando é usada pelo projeto Ultimate Nginx Bad Bot (1000 estrelas) para limpar o relatório de email ;-)
more
ouless -R
interpretar os códigos de escape como cores em vez de como um editor de texto.