Tengo un script que produce resultados con colores y necesito eliminar los códigos ANSI.
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript
El resultado es (en el archivo de registro):
java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m]
No sabía cómo poner el personaje ESC aquí, así que puse @
en su lugar.
Cambié el guión a:
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Pero ahora me da (en el archivo de registro):
java (pid 12321) is running...@[60G[ OK ]
¿Cómo puedo eliminar esto también @[60G
?
¿Tal vez hay una manera de deshabilitar completamente el color para todo el script?
strip-ansi
: github.com/chalk/strip-ansi .Respuestas:
Según Wikipedia , el comando
[m|K]
en elsed
que está utilizando está específicamente diseñado para manejarm
(el comando de color) yK
(el comando "borrar parte de la línea"). Su secuencia de comandos está tratando de establecer la posición absoluta del cursor en 60 (^[[60G
) para obtener todos los OK en una línea, que sused
línea no cubre.(Correctamente,
[m|K]
probablemente debería ser(m|K)
o[mK]
, porque no estás tratando de hacer coincidir un carácter de tubería. Pero eso no es importante en este momento).Si cambia esa coincidencia final en su comando
[mGK]
ao(m|G|K)
, debería poder capturar esa secuencia de control adicional.fuente
brew install gnu-sed
instalará una versión capaz. Corre congsed
.echo "$(tput setaf 1)foo$(tput sgr0) bar" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | cat -A
, obtengo:foo^O bar$
Entonces, supongo que algunos caracteres no se eliminan correctamente, ¿verdad? ¿Sabes cómo corregir?setaf
soporte) requieren más parámetros que solo dos; mi expresión regular admite dos. Cambiar el primer?
out para*
debería ayudar. El manejosgr0
es posible, pero en función de una búsqueda, es probable que crezca fuera del alcance de esta respuesta basada en expresiones regulares.sed
a la tubería para quitar el carácter "cambio"[38;5;45m
). Esta respuesta alternativa funciona unix.stackexchange.com/a/55547/168277No pude obtener resultados decentes de ninguna de las otras respuestas, pero lo siguiente funcionó para mí:
Si solo eliminé el control char "^ [", dejó el resto de los datos de color, por ejemplo, "33m". Incluyendo el código de color y "m" hizo el truco. Estoy desconcertado con s / \ x1B // g no funciona porque \ x1B [31m ciertamente funciona con echo.
fuente
-E
lugar de-r
para expresiones regulares extendidas. Más se puede encontrar aquí{1,3}
a{,3}
(de lo contrario, seguía faltando algunos controles), gracias por su solución!sed -r "s/[[:cntrl:]]\[([0-9]{1,3};)*[0-9]{1,3}m//g"
En mi humilde opinión, la mayoría de estas respuestas intentan demasiado restringir lo que está dentro del código de escape. Como resultado, terminan perdiendo códigos comunes como
[38;5;60m
(ANSI color 60 en primer plano del modo de 256 colores).También requieren la
-r
opción que habilita las extensiones GNU . Estos no son obligatorios; solo hacen que la expresión regular se lea mejor.Aquí hay una respuesta más simple que maneja los escapes de 256 colores y funciona en sistemas con no GNU
sed
:Esto capturará cualquier cosa que comience
[
, tenga cualquier número de decimales y punto y coma, y termine con una letra. Esto debería detectar cualquiera de las secuencias de escape ANSI comunes .Para divertirse, aquí hay una solución más grande y más general (pero mínimamente probada) para todas las secuencias de escape ANSI concebibles :
(y si tiene el problema SI de @ edi9999, agréguelo
| sed "s/\x0f//g"
al final; esto funciona para cualquier carácter de control al reemplazarlo0f
con el hexadecimal del carácter no deseado)fuente
|
en sed,]
dentro de una clase de caracteres en sed, y'
en una cadena de comillas con comillas simples. Ahora está funcionando para mí para un caso de prueba muy básico.Para Mac OSX o BSD uso
fuente
-E
indicador para sed para habilitar la expresión regular extendida.También tuve el problema de que a veces aparecía el personaje SI.
Sucedió, por ejemplo, con esta entrada:
echo "$(tput setaf 1)foo$(tput sgr0) bar"
Aquí hay una manera de quitar también el carácter SI (shift in) (0x0f)
fuente
Hmm, no estoy seguro de si esto funcionará para usted, pero 'tr' eliminará (eliminará) códigos de control .
fuente
rwxr-xr-x 1 tokra admin 22 Oct 18 14:21 [0m[01;36m/usr/local/opt/gradle[0m -> [01;34m../Cellar/gradle/4.2.1[0m/
Tuve un problema similar. Todas las soluciones que encontré funcionaron bien para los códigos de color, pero no eliminaron los caracteres agregados por
"$(tput sgr0)"
(restablecer atributos).Tomando, por ejemplo, la solución en el comentario de davemyron, la longitud de la cadena resultante en el ejemplo a continuación es 9, no 6:
Para que funcione correctamente, la expresión regular tuvo que extenderse para que también coincida con la secuencia agregada por
sgr0
("\E(B
"):fuente
Función mucho más simple en Bash puro para filtrar códigos ANSI comunes de una secuencia de texto:
Ver:
fuente
tldr
. (Aunque uso zsh, también podría ser por eso.)extglob
o probablemente tampoco entenderá el reemplazo de cadenas por completo.sed
mencionan aquí que funcionarán con Zsh.La solución de @ jeff-bowman me ayudó a deshacerme de ALGUNOS de los códigos de color. Agregué otra pequeña porción a la expresión regular para eliminar un poco más:
fuente
Aquí hay una solución Bash pura.
Guardar como
strip-escape-codes.sh
, hacer ejecutable y luego ejecutar<command-producing-colorful-output> | ./strip-escape-codes.sh
.Tenga en cuenta que esto elimina todos los códigos / secuencias de escape ANSI. Si solo desea eliminar los colores, reemplácelos
[a-zA-Z]
por"m"
.Bash> = 4.0:
Golpe <4.0:
fuente
La idea controvertida sería reconfigurar la configuración del terminal para este entorno de proceso para que el proceso sepa que el terminal no admite colores.
Algo así me
TERM=xterm-mono ./somescript
viene a la mente. YMMV con su sistema operativo específico y la capacidad de su script para comprender la configuración de color del terminal.fuente
Esto funciona para mi:
fuente
somescript
se implemente. Puede o no reconocer que su salida estándar es una tty. (Las palabras delincuentes en realidad codifican códigos de escape específicos del terminal en el programa, y se rompen horriblemente cuando se usan en otros terminales o en scripts).