Examinando la salida de
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
en un editor de texto (p. ej. 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 un tipo de editor de flujo.
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'
more
oless -R
interpretar los códigos de escape como color en lugar de un editor de texto.Respuestas:
Los caracteres
^[[37m
y^[[0m
son parte de las secuencias de escape ANSI (códigos CSI) . Ver también estas especificaciones .Usando GNU
sed
\x1b
(o\x1B
) es el carácter especial de escape(
sed
no admite alternativas\e
y\033
)\[
es el segundo personaje de la secuencia de escape[0-9;]*
son los valores de color regexm
es el último personaje de la secuencia de escapeMac En macOS, el
sed
comando predeterminado no admite caracteres especiales\e
como los señalados por slm y steamer25 en los comentarios. Use en su lugargsed
que puede instalar usandobrew install gnu-sed
.Ejemplo con la línea de comando de OP : (OP significa Cartel original)
Tom Hale sugiere eliminar todas las demás secuencias de escape utilizando en
[a-zA-Z]
lugar de solo la letram
específica de la secuencia de escape del modo de gráficos (color). Pero[a-zA-Z]
puede ser demasiado ancho y podría eliminar demasiado. Michał Faleński y Miguel Mota proponen eliminar solo algunas secuencias de escape usando[mGKH]
y[mGKF]
respectivamente. Britton Kerin indicaK
que también se debe usar además dem
eliminar los colores delgcc
error / advertencia (no se olvide de redirigirgcc 2>&1 | sed...
).Utilizando
perl
La versión de
sed
instalado en algunos sistemas operativos puede ser limitada (por ejemplo, macOS). El comandoperl
tiene la ventaja de ser generalmente más fácil de instalar / actualizar en más sistemas operativos. Adam Katz sugiere usar\e
(igual que\x1b
) en PCRE .Elija su expresión regular en función de la cantidad de comandos que desea filtrar:
Ejemplo con la línea de comando de OP:
Uso
Como lo señaló el comentario de Stuart Cardall , esta
sed
línea de comando es utilizada por el proyecto Ultimate Nginx Bad Bot (1000 estrellas) para limpiar el informe del correo electrónico ;-)fuente
sed
comando y la explicación. :)1;31m
mejor agregarlo;
a su expresión regular:cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'
o no se eliminarán.sed
no funcionó con el ejemplo que se muestra, pero lagsed
versión sí funciona.brew install gnu-sed
.He encontrado un mejor eliminador de secuencia de escape. Mira esto:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
fuente
sed -r
que NO.Lo que se muestra como no
^[
es y ; es el carácter ASCII , producido por o (la notación significa la tecla Ctrl).^
[
ESC
EscCtrl[^
ESC
es 0x1B hexadecimal u 033 octal, por lo que debe usar\x1B
o\033
en sus expresiones regulares:fuente
Si prefiere algo simple, puede usar el módulo strip-ansi (se requiere Node.js ):
Entonces úsalo así:
O simplemente pasar una cadena:
fuente
cat
( UUOC ): debería ser posible hacerlostrip-ansi colors.o
o al menosstrip-ansi < colors.o
.strip-ansi < colors.o
, pero por experiencia la gente está más familiarizada con las tuberías. He actualizado la respuesta.commandlinefu da esta respuesta que elimina los colores ANSI y los comandos de movimiento:
Por solo colores, quieres:
fuente
Creo que esta es una eliminación autorizada de todas las secuencias de escape ANSI :
(Tenga en cuenta que perl, como muchos otros idiomas (pero no sed), acepta
\e
como carácter de escape Esc,\x1b
o\033
por código, que se muestra en las terminales como^[
. Lo estoy usando aquí porque parece más intuitivo).Este comando perl, que puede ejecutar todo en una línea si lo prefiere, tiene cuatro reemplazos:
El primero va después de las secuencias CSI (secuencias de código de escape que comienzan con el "Introductor de secuencia de control" de Esc[, que cubre mucho más que las secuencias Seleccionar representación gráfica que componen los códigos de color y otras decoraciones de texto).
El segundo reemplazo elimina las secuencias restantes que involucran caracteres finales y terminan con ST (String Terminator, Esc\). El tercero de reemplazo es lo mismo, pero también permite comando del sistema operativo secuencias de terminar con una BEL (
\x07
,\007
, a menudo\a
).El cuarto reemplazo elimina los escapes restantes.
También considere eliminar otros caracteres ASCII de ancho cero, como BEL y otros caracteres de control C0 y C1 más oscuros . He estado usando
s/[\x00-\x1f\x7f-\x9f\xad]+//g
, que también incluye Delete y Soft Hyphen . Esto excluye los caracteres de ancho cero codificados más altos de Unicode, pero creo que es exhaustivo para ASCII (Unicode\x00
-\xff
). Si hace esto, elimine estos últimos ya que pueden estar involucrados en secuencias más largas.fuente
La pregunta "respondida" no funcionó para mí, así que creé esta expresión regular para eliminar las secuencias de escape producidas por el módulo Perl Term :: ANSIColor.
La expresión regular de Grawity debería funcionar bien, pero el uso de + también parece funcionar bien.
fuente
The "answered" question
? ¿Te refieres a la respuesta aceptada? (2) Este comando no funciona, ni siquiera se ejecuta, porque tiene una cita sin igual (desequilibrada). (3) Este es un uso inútil decat
( UUOC ): debería ser posible hacerlo . (4) ¿Quién dijo algo sobre los códigos que están en un archivo?perl -pe
command
colors.o
.o
"tput sgr0" dejó este carácter de control ^ (B ^ [
Aquí hay una versión modificada para encargarse de eso.
fuente
tput sgr0
que las otras soluciones no parecen ser capaces de deshacerse de él.Tuve un problema similar con la eliminación de caracteres agregados de la recopilación de salida superior interactiva a través de masilla y esto ayudó:
fuente
cat
( UUOC ): debería ser posible hacerlo .perl -pe
command
putty1.log
Esto es lo que funcionó para mí (probado en Mac OS X)
fuente