Eliminar códigos de color ANSI del flujo de texto

Eliminar códigos de color ANSI del flujo de texto

Examinando la salida de

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'

en un editor de texto (por ejemplo, vi) muestra lo siguiente:

^[[37mABC
^[[0m

¿Cómo se eliminarían los códigos de color ANSI del archivo de salida? Supongo que la mejor manera sería canalizar la salida a través de una especie de editor de secuencias.

Lo siguiente no 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'

Respuesta1

Los personajes ^[[37my ^[[0mson parte delSecuencias de escape ANSI (códigos CSI). Ver tambiénestas especificaciones.

Usando GNUsed

sed -e 's/\x1b\[[0-9;]*m//g'
  • \x1b(o \x1B) es elescaparcarácter especial
    (GNU sedno admite alternativas \ey \033)
  • \[es el segundo personaje de la secuencia de escape
  • [0-9;]*es la expresión regular del valor del color
  • mes el último personaje de la secuencia de escape

Usando el valor predeterminado de macOSsed

Miguelsugiere:

sed -e $'s/\x1b\[[0-9;]*m//g'

El valor predeterminado de macOS sedno admite caracteres especiales como lo \eseñalaslmyvapor25en los comentarios.

Instalar gsed.

brew install gnu-sed

Ejemplo con la línea de comando de OP

(OP significa Póster Original)

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | 
      sed 's/\x1b\[[0-9;]*m//g'

Mejoras

La bandera -ees opcional para GNU sedpero requerida para el valor predeterminado de macOS sed:

sed 's/\x1b\[[0-9;]*m//g'           # Remove color sequences only

Tom Halesugiere eliminar también todas las demás secuencias de escape usando [a-zA-Z]en lugar de solo la letra mespecífica de la secuencia de escape del modo gráfico (color):

sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'    # Remove all escape sequences

Pero [a-zA-Z]puede que sea demasiado ancho y podría quitar demasiado.Michał Falenskiymiguel motaProponemos eliminar solo algunas secuencias de escape usando [mGKH]y [mGKF]respectivamente.

sed 's/\x1b\[[0-9;]*[mGKH]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKHF]//g'     # Remove all
Last escape
sequence
character   Purpose
---------   -------------------------------
m           Graphics Rendition Mode (including color)
G           Horizontal cursor move
K           Horizontal deletion
H           New cursor position
F           Move cursor to previous n lines

Britton Kerinindica K(además de m) elimina los colores de gccerror/advertencia. No olvides redirigir gcc 2>&1 | sed....

Usandoperl

La versión sedinstalada en algunos sistemas operativos puede ser limitada (por ejemplo, macOS). El comando perltiene la ventaja de ser generalmente más fácil de instalar/actualizar en más sistemas operativos.Adam Katzsugiere usar \e(igual que \x1b) enPCRE.

Elija su expresión regular dependiendo de cuántos comandos desee filtrar:

perl -pe 's/\e\[[0-9;]*m//g'          # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick

Ejemplo con la línea de comando de OP:

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
      | perl -pe 's/\e\[[0-9;]*m//g'

Uso

Como lo señalaStuart CardallComentario, esta sedlínea de comando es utilizada por el proyecto.Último robot malo de Nginx(1000 estrellas) para limpiar el informe de correo electrónico ;-)

Respuesta2

Descubrí un mejor eliminador de secuencias de escape si estás usando MacOS. Mira esto:

perl -pe 's/\x1b\[[0-9;]*[mG]//g'

Respuesta3

ansi2txt

https://unix.stackexchange.com/a/527259/116915

cat typescript | ansi2txt | col -b
  • ansi2txt: eliminar códigos de color ANSI
  • col -b: eliminar ^Ho^M


actualización: acerca de las pestañas de manejo de columnas y el espacio //mencionado por @DanielF

〇. sobre colmanejar espacios y tabulaciones

col -bxreemplace '\t' por ' ', col -bhreemplace ' ' por '\t'.

// parece colque no puedo mantener los espacios/pestañas como están, es una lástima.


0. cadena original

$ echo -e '        ff\tww' | hd
00000000  20 20 20 20 20 20 20 20  66 66 09 77 77 0a        |        ff.ww.|

1. -h reemplaza los espacios en la pestaña

$ echo -e '        ff\tww' | col -b | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|
$ echo -e '        ff\tww' | col -bxh | hd
00000000  09 66 66 09 77 77 0a                              |.ff.ww.|

2. -x reemplazar la pestaña en espacios

$ echo -e '        ff\tww' | col -bx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|
$ echo -e '        ff\tww' | col -bhx | hd
00000000  20 20 20 20 20 20 20 20  66 66 20 20 20 20 20 20  |        ff      |
00000010  77 77 0a                                          |ww.|

3. Parece colque no se pueden mantener espacios y tabulaciones como están.

Respuesta4

Lo que se muestra tal ^[cualno ^y [; es el ESCcarácter ASCII, producido por Esco Ctrl[(la ^notación significa la tecla Ctrl).

ESCes 0x1B hexadecimal o 033 octal, por lo que debes usar \x1Bo \033en tus expresiones regulares:

perl -pe 's/\033\[37m//g; s/\033[0m//g'

perl -pe 's/\033\[\d*(;\d*)*m//g'

información relacionada