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

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

Atualmente 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\1\o033[39m/'

Este é amarelo brilhante, mas estou chegando às 256 cores estendidas no bash e gostaria de usar a cor laranja. Encontrei o esquema correto de numeração de cores de primeiro plano e fundo para me dar laranja em 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 possa usar com o comando tail.

Eu tentei isso:

sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[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". Também tentei deixar de fora o esquema de plano de fundo e apenas usar o laranja:

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

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

ATUALIZAR:

Isso funciona:

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

Mas deixa outras linhas que não contêm magenta de cor MENOR. Como faço para que eles voltem ao branco. Não estou desligando algo corretamente? Na verdade, está tornando a cor da fonte padrão para todo o shell magenta, como posso ver quando encerro o comando tail.

Responder1

Há mais de um problema, visto ao fazer um script com seus exemplos:

#!/bin/sh
MSG="this is MAJOR stuff"
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[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, a ^[[93mé o escape de 16 cores do aixterm para definir um texto amarelo e ^39mredefine o texto para as cores padrão do terminal.

A segunda linha tem problemas com uma sequência de escape não terminada (que começa definindo o fundo como preto=40, piscando=5, 95=texto magenta brilhante, depois 38 e 5 tentam introduzir uma sequência de 256 cores - que não é finalizada) .

A terceira linha é uma ligeira variação da segunda.

O principal problema é que você sednão emite um caractere de escape, a menos que você o expresse como \o033(o que vocêfezfazer em alguns lugares).

Em segundo lugar, você não está encerrando as fugas de maneira adequada. Essa final mfaz parte da sequência. Quando falta o caractere final, toda a sequência pode ser descartada. É melhor ler a documentação:Sequências de controle XTerm.

Por falar nisso,ANSInunca documentou nada além de 8 cores, por isso é menos confuso referir-se às sequências pela implementação original (aixterm para 16 cores, xterm para 256 cores).

Se você simplesmente quiser linhas inteiras comPRINCIPALpara ser destacado em laranja, então (com base nos comentários), você poderia ter feito isso:

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

No entanto, o 5código é menos amplamente suportado do que o 2uso de R/G/B, algo assim:

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

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

Leitura adicional:

CSI Pm m Character Attributes (SGR).

Responder2

Você provavelmente está procurando por isso:

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

embora possa ser simplificado com

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

Observe a mudança 40para 48o que significa que queremos alterar a cor de fundo.

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

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

e se a cor de fundo já for preta, você não precisa alterá-la:

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

informação relacionada