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.

Bob Dylan
fuente
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
Miedo
fuente
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.

Catskul
fuente
-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).

Giacomo Catenazzi
fuente
1
Esto no respondió la pregunta.
Thomas Dickey
1
No. menos -R en realidad resolvió el problema por mí.
Ken Ingram el