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 através de um tipo 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'
more
ouless -R
interpretar os códigos de escape como cores em vez de como um editor de texto.Respostas:
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
\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 regexm
é o último caractere da sequência de escapeMac 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, usegsed
que você pode instalar usandobrew install gnu-sed
.Exemplo com a linha de comando do OP: (OP significa Pôster original)
Tom Hale sugere remover todas as outras seqüências de escape usando em
[a-zA-Z]
vez da letram
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 indicaK
que também deve ser usado além dem
remover as cores degcc
erro / aviso (não se esqueça de redirecionargcc 2>&1 | sed...
).Usando
perl
A versão do
sed
instalada em alguns sistemas operacionais pode ser limitada (por exemplo, macOS). O comandoperl
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:
Exemplo com a linha de comando do OP:
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 ;-)fonte
sed
comando e a explicação. :)1;31m
é melhor adicionar;
ao seu regex:cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'
ou eles não serão removidos.sed
não funcionou com o exemplo mostrado, mas agsed
versão funciona.brew install gnu-sed
.Eu descobri um melhor removedor de seqüência de escape. Verifique isto:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
fonte
sed -r
NÃO.O que é exibido como não
^[
é e ; é o caractere ASCII , produzido por ou (a notação significa a tecla Ctrl).^
[
ESC
EscCtrl[^
ESC
é 0x1B hexadecimal ou 033 octal, então você deve usar\x1B
ou\033
em suas expressões regulares:fonte
Se você preferir algo simples, poderá usar o módulo strip-ansi (é necessário o Node.js. ):
Em seguida, use-o assim:
Ou apenas passe uma string:
fonte
cat
( UUOC ) - deve ser possível fazerstrip-ansi colors.o
ou pelo menosstrip-ansi < colors.o
.strip-ansi < colors.o
, mas por experiência as pessoas estão mais familiarizadas com a tubulação. Eu atualizei a resposta.commandlinefu fornece esta resposta que retira as cores ANSI e os comandos de movimento:
Para apenas cores, você deseja:
fonte
Eu acredito que esta é uma remoção autorizada de todas as seqüências de escape ANSI :
(Observe que o perl, como muitos outros idiomas (mas não o sed), aceita
\e
como caractere de escape Esc,\x1b
ou\033
por código, mostrado nos terminais como^[
. Estou usando-o aqui porque parece mais intuitivo.)Este comando perl, que você pode executar todos em uma linha, se preferir, possui quatro substituições:
A primeira ocorre após as seqüências CSI (sequências de códigos de escape que começam com o "Control Sequence Introducer" de Esc[, que abrange muito mais do que as sequências Select Graphic Rendition que compõem os códigos de cores e outras decorações de texto).
A segunda substituição remove as seqüências restantes que envolvem caracteres finais e termina com ST (o terminador de seqüência de caracteres Esc\). A terceira substituição é a mesma coisa, mas também permite Operacional comando do sistema seqüências para acabar com um BEL (
\x07
,\007
, muitas vezes\a
).A quarta substituição remove as fugas restantes.
Considere também remover outros caracteres ASCII de largura zero, como BEL e outros caracteres de controle C0 e C1 mais obscuros . Eu tenho usado
s/[\x00-\x1f\x7f-\x9f\xad]+//g
, que também inclui Excluir e Soft Hífen . Isso exclui os caracteres de largura zero codificados mais altos do Unicode, mas acredito que seja exaustivo para o ASCII (Unicode\x00
-\xff
). Se você fizer isso, remova esses últimos, pois eles podem estar envolvidos em seqüências mais longas.fonte
A pergunta "respondida" não funcionou para mim, então criei esse regex para remover as seqüências de escape produzidas pelo módulo Perl Term :: ANSIColor.
O regex do Grawity deve funcionar bem, mas o uso de + parece funcionar também.
fonte
The "answered" question
? Você quer dizer a resposta aceita? (2) Este comando não funciona - nem mesmo é executado - porque possui uma cotação inigualável (desequilibrada). (3) Este é um uso inútil decat
( UUOC ) - deve ser possível . (4) Quem nunca disse algo sobre os códigos estarem em um arquivo?perl -pe
command
colors.o
.o
"tput sgr0" deixou esse caractere de controle ^ (B ^ [
Aqui está uma versão modificada para cuidar disso.
fonte
tput sgr0
que as outras soluções nunca parecem capazes de se livrar.Eu tive um problema semelhante com a remoção de caracteres adicionados ao coletar saída superior interativa via massa e isso ajudou:
fonte
cat
( UUOC ) - deve ser possível .perl -pe
command
putty1.log
Foi isso que funcionou para mim (testado no Mac OS X)
fonte