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).