pt - encontre a sequência de cores correta para 256 cores do ANSI estendido

2

No momento, estou usando o seguinte comando para usar as cores ANSI padrão com o comando tail:

tail -f syslogfile | sed -e 's/\(.*MAJOR.*\)/\o033[93m\o033[39m/'

Isso é amarelo brilhante, no entanto, estou entrando em 256 cores no bash e gostaria de usar a cor laranja. Eu encontrei o primeiro plano de numeração de cor e plano de fundo correto para me dar laranja no preto.

echo -e "\033[40;5;95;38;5;202mhello world\033[0m"

No entanto, estou tendo problemas para traduzir isso em um comando sed que eu possa usar com o comando tail.

Eu tentei isso:

sed -e 's/\(.*MAJOR.*\)/3[40;5;95;38;5;2023[0m/'

Mas isso deixa tudo branco. Eu tentei:

sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'

Mas isso apaga as linhas que contêm a string "MAJOR". Eu também tentei deixar de fora o esquema de fundo e apenas indo com a laranja:

sed -e 's/\(.*MAJOR.*\)/3[38;5;2023[0m/'

Mas isso também parece ocultar as linhas que contêm a palavra "MAJOR" Alguém sabe qual seria a seqüência ANSI correta para sed me laranja no preto? FYI o comando sed eu usei no meu primeiro exemplo imprime a linha inteira na cor escolhida e eu precisaria do mesmo comportamento com a nova seqüência de cores, não apenas colorindo a própria palavra.

ATUALIZAÇÃO:

Isso funciona:

sed -e 's/\(.*MINOR.*\)/\o033[38;5;202m\o033[40;5;95m/'

Mas deixa outras linhas que não contêm magenta colorida MENOR. Como faço para que as configurações padrão voltem ao branco? Eu não estou desligando algo corretamente? Na verdade, está tornando a cor da fonte padrão para todo o magenta do shell, como posso ver quando termino o comando tail.

    
por user53029 21.06.2016 / 21:38

2 respostas

2

Provavelmente você está procurando por isso:

sed -e 's/\(.*MAJOR.*\)/\o033[48;5;95;38;5;202m\o033[0m/'

embora possa ser simplificado com

sed -e 's/.*MAJOR.*/\o033[48;5;95;38;5;202m&\o033[m/'

Observe a alteração de 40 para 48 , o que significa que queremos alterar a cor do plano de fundo.

Se você quiser que a cor do plano de fundo seja preta:

sed -e 's/.*MAJOR.*/\o033[40;38;5;202m&\o033[m/'

e se a cor de fundo já estiver preta, não será necessário alterá-la:

sed -e 's/.*MAJOR.*/\o033[38;5;202m&\o033[m/'
    
por 21.06.2016 / 22:00
3

Há mais de um problema, visto fazendo um script dos seus exemplos:

#!/bin/sh
MSG="this is MAJOR stuff"
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[93m\o033[39m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/3[40;5;95;38;5;2023[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/3[38;5;2023[0m/'

que produz ( ^[ é escape):

^[[93mthis is MAJOR stuff^[[39m
this is MAJOR stuff33[40;5;95;38;5;202this is MAJOR stuff33[0m
^[[40;5;95;38;5;202^[[0m
this is MAJOR stuff33[38;5;202this is MAJOR stuff33[0m

Na primeira linha, um ^[[93m é o escape aixterm de 16 cores para definir um texto amarelo, e ^39m redefine o texto para as cores padrão do terminal.

A segunda linha tem problemas com uma seqüência de escape não terminada (que começa definindo o plano de fundo como preto = 40, pisca = 5, 95 = texto magenta brilhante, 38 e 5 tenta introduzir uma seqüência de 256 cores - que é não terminado).

A terceira linha é uma ligeira variação do segundo.

O principal problema é que seu sed não emite um caractere de escape a menos que você o expresse como \o033 (o que você fez faz em alguns lugares).

Segundo, você não está terminando as fugas corretamente. Esse% final m é parte da sequência. Quando o caractere final está faltando, toda a sequência pode ser descartada. É melhor ler a documentação: Sequências de Controle do XTerm .

A propósito, ANSI nunca documentou nada além das 8 cores, portanto é menos confuso referenciar as sequências pela implementação original (aixterm para 16 cores, xterm para 256 cores). / p>

Se você quiser que linhas inteiras com MAJOR sejam destacadas em laranja, (com base nos comentários), você poderia ter feito isso:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;5;95m\o033[m/'

No entanto, o código 5 tem menos suporte do que o 2 usando R / G / B, algo assim:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;2;128;128;0m\o033[m/'

(os 128 são apenas uma primeira tentativa - seus gostos podem variar).

Leitura adicional:

CSI Pm m Character Attributes (SGR).

    
por 21.06.2016 / 22:05

Tags