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 ^[[37m
y ^[[0m
son 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
(GNUsed
no admite alternativas\e
y\033
)\[
es el segundo personaje de la secuencia de escape[0-9;]*
es la expresión regular del valor del colorm
es 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 sed
no admite caracteres especiales como lo \e
señ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 -e
es opcional para GNU sed
pero 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 m
especí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 gcc
error/advertencia. No olvides redirigir gcc 2>&1 | sed...
.
Usandoperl
La versión sed
instalada en algunos sistemas operativos puede ser limitada (por ejemplo, macOS). El comando perl
tiene 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 sed
lí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 ANSIcol -b
: eliminar^H
o^M
actualización: acerca de las pestañas de manejo de columnas y el espacio //mencionado por @DanielF
〇. sobre col
manejar espacios y tabulaciones
col -bx
reemplace '\t' por ' ',
col -bh
reemplace ' ' por '\t'.
// parece col
que 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 col
que no se pueden mantener espacios y tabulaciones como están.
Respuesta4
Lo que se muestra tal ^[
cualno ^
y [
; es el ESC
carácter ASCII, producido por Esco Ctrl[(la ^
notación significa la tecla Ctrl).
ESC
es 0x1B hexadecimal o 033 octal, por lo que debes usar \x1B
o \033
en tus expresiones regulares:
perl -pe 's/\033\[37m//g; s/\033[0m//g'
perl -pe 's/\033\[\d*(;\d*)*m//g'