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'

moreoless -Rinterpretar los códigos de escape como color en lugar de un editor de texto.Respuestas:
Los caracteres
^[[37my^[[0mson 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(
sedno admite alternativas\ey\033)\[es el segundo personaje de la secuencia de escape[0-9;]*son los valores de color regexmes el último personaje de la secuencia de escapeMac En macOS, el
sedcomando predeterminado no admite caracteres especiales\ecomo los señalados por slm y steamer25 en los comentarios. Use en su lugargsedque 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 letramespecí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 indicaKque también se debe usar además demeliminar los colores delgccerror / advertencia (no se olvide de redirigirgcc 2>&1 | sed...).Utilizando
perlLa versión de
sedinstalado en algunos sistemas operativos puede ser limitada (por ejemplo, macOS). El comandoperltiene 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
sedlínea de comando es utilizada por el proyecto Ultimate Nginx Bad Bot (1000 estrellas) para limpiar el informe del correo electrónico ;-)fuente
sedcomando y la explicación. :)1;31mmejor agregarlo;a su expresión regular:cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'o no se eliminarán.sedno funcionó con el ejemplo que se muestra, pero lagsedversió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 -rque NO.Lo que se muestra como no
^[es y ; es el carácter ASCII , producido por o (la notación significa la tecla Ctrl).^[ESCEscCtrl[^ESCes 0x1B hexadecimal u 033 octal, por lo que debe usar\x1Bo\033en 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.oo 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
\ecomo carácter de escape Esc,\x1bo\033por 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 -pecommandcolors.o.o"tput sgr0" dejó este carácter de control ^ (B ^ [
Aquí hay una versión modificada para encargarse de eso.
fuente
tput sgr0que 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 -pecommandputty1.logEsto es lo que funcionó para mí (probado en Mac OS X)
fuente