Mostrar archivo con colores ANSI


12

Tengo un archivo con colores ANSI.

test.txt:
\e[0;31mExample\e[0m

Me gustaría mostrar el contenido de este archivo en un terminal, como lo cathace, pero también me gustaría mostrar los colores.


44
Usando less -R, por ejemplo.
Thomas Dickey

¿Qué catimprime?
techraf

1
La pregunta de OP tenía demasiadas respuestas posibles para ser interesante. Comenzar con echo -e $(cat test.txt).
Thomas Dickey

Respuestas:


10

Estaba buscando una solución a esta pregunta exacta de bash. Casi me pierdo el comentario de @Thomas Dickey que me proporcionó la solución más elegante.

echo -e $(cat test.txt)

Algunas cosas que no funcionaron para mí son (aparentemente no puedes canalizar las cosas para hacer eco)

cat test.txt | echo -e

o

less -R test.txt

Otro problema que tuve fue que echo -e no imprimió nuevas líneas y espacios en blanco contiguos dentro del archivo muy bien. Para imprimirlos, usé lo siguiente.

echo -ne $(cat test.txt | sed  's/$/\\n/' | sed 's/ /\\a /g')

Esto funciona para un archivo test.txt que contiene

\e[0;31mExa         mple\e[0m
\e[0;31mExample line2\e[0m

Buena respuesta, pero \asuena el timbre para mí. Cambié tu segundo comando sed al sed 's/ /\\033\\a /g'que no suena la campana.
halcón el

1
Después de realizar más pruebas y encontrar más inconsistencias en diferentes programas de terminal (iTerm, Atom / nuclide), he encontrado que es mejor $(cat file.txt)incluir comillas dobles y agregar una nueva línea al final, sin necesidad de sed, así que: echo -ne "$(<file.txt)" \\no echo -ne "$(cat <<"EOF" . . . EOF)" \\n. Eso también evita que bash realice una expansión global en el texto.
halcón el

1

Si no está viendo el color de catlos caracteres de control, probablemente no estén intactos.

Algunas herramientas eliminan los caracteres de control pero se dejan en la cola.

Comparar:

 echo -e "\e[0;31mExample\e[0m foo"

a

 echo -e "[0;31mExample[0m foo" 

Es posible que pueda reconstruir la secuencia de control a partir de lo que queda, aunque no es infalible, ya que la expresión regular que usa puede atraer accidentalmente secuencias de caracteres no deseadas, etc. Pero, por ejemplo:

echo -e "[0;31mExample[0m foo" | sed "s:\[\([0-9]*[;m]\):^[[\1:g"

restauraría el color a la cadena de ejemplo.


-1

Debería funcionar por defecto. Por ejemplo, si lo hago ls --color=always > /tmp/ay luego cat /tmp/a, veo los colores. La comprobación con odconfirma que el archivo utiliza colores ANSI.

Así que creo que debería verificar si su terminal admite colores ANSI (y están habilitados).


1
Esto no respondió la pregunta.
Thomas Dickey

1
No. menos -R en realidad resolvió el problema por mí.
Ken Ingram el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.