sed: encuentra la secuencia de colores correcta para ANSI extendido 256 colores

sed: encuentra la secuencia de colores correcta para ANSI extendido 256 colores

Actualmente estoy usando el siguiente comando para usar los colores ANSI estándar con el comando tail:

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

Este es amarillo brillante, sin embargo, estoy empezando a usar 256 colores extendidos en bash y me gustaría usar el color naranja. Encontré el esquema de numeración de colores de primer plano y de fondo correcto para obtener naranja sobre negro.

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

Sin embargo, tengo problemas para traducir esto a un comando sed que pueda usar con el comando tail.

He probado esto:

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

Pero eso deja todo blanco. Yo he tratado:

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

Pero esto oscurece las líneas que contienen la cadena "MAJOR". También intenté omitir el esquema de fondo y optar simplemente por el color naranja:

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

Pero esto también parece oscurecer las líneas que contienen la palabra "MAJOR". ¿Alguien sabe cuál sería la secuencia ANSI correcta para que sed me dé naranja sobre negro? Para su información, el comando sed que utilicé en mi primer ejemplo imprime la línea completa en el color elegido y necesitaría el mismo comportamiento con la nueva secuencia de colores, no solo colorear la palabra en sí.

ACTUALIZAR:

Esto funciona:

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

Pero deja otras líneas que no contienen magenta de color MENOR. ¿Cómo puedo hacer para que vuelvan a ser blancos por defecto? ¿No estoy apagando algo correctamente? En realidad, está creando un color de fuente predeterminado para todo el shell magenta, como puedo ver cuando finalizo el comando tail.

Respuesta1

Hay más de un problema, visto al hacer un script de tus ejemplos:

#!/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 produce ( ^[es 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

En la primera línea, a ^[[93mes el escape de 16 colores de aixterm para establecer un texto amarillo y ^39mrestablece el texto a los colores predeterminados del terminal.

La segunda línea tiene problemas con una secuencia de escape no terminada (que comienza configurando el fondo en negro=40, parpadeo=5, 95=texto magenta brillante, luego 38 y 5 intentan introducir una secuencia de 256 colores, que no termina) .

La tercera línea es una ligera variación de la segunda.

El principal problema es que sedno emite un carácter de escape a menos que lo exprese como \o033(lo cualhizohacer en algunos lugares).

En segundo lugar, no estás poniendo fin a las fugas correctamente. Esa final mes parte de la secuencia. Cuando falta el carácter final, se puede descartar toda la secuencia. Lo mejor es leer la documentación:Secuencias de control XTerm.

Por cierto,ANSINunca documenté nada más allá de 8 colores, por lo que es menos confuso hacer referencia a las secuencias mediante la implementación original (aixterm para 16 colores, xterm para 256 colores).

Si simplemente quieres líneas enteras conIMPORTANTEpara estar resaltado en naranja, entonces (según los comentarios), podría haber hecho esto:

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

Sin embargo, el 5código es menos compatible que el 2uso de R/G/B, algo como esto:

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

(Los 128 son sólo un primer intento; sus gustos pueden variar).

Otras lecturas:

CSI Pm m Character Attributes (SGR).

Respuesta2

Probablemente estés buscando esto:

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

aunque se puede simplificar con

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

Observe el cambio de 40lo 48que significa que queremos cambiar el color de fondo.

Si desea que el color de fondo sea negro:

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

y si el color de fondo ya es negro, no es necesario cambiarlo en absoluto:

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

información relacionada