Exibir arquivo com cores ANSI


12

Eu tenho um arquivo com cores ANSI.

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

Gostaria de exibir o conteúdo desse arquivo em um terminal, como o catfaz, mas gostaria de exibir as cores também.


4
Usando less -R, por exemplo.
Thomas Dickey

Qual é a sua catimpressão?
techraf

1
A pergunta do OP tinha muitas respostas possíveis para ser interessante. Comece com echo -e $(cat test.txt).
Thomas Dickey

Respostas:


10

Eu estava procurando uma solução para essa pergunta exata do bash. Quase senti falta do comentário de @Thomas Dickey, que me forneceu a solução mais elegante.

echo -e $(cat test.txt)

Algumas coisas que não funcionaram para mim são (aparentemente você não pode fazer coisas ecoarem)

cat test.txt | echo -e

ou

less -R test.txt

Outro problema que tive foi que echo -e não imprimia novas linhas e espaços em branco contíguos no arquivo. Para imprimi-las, usei o seguinte.

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

Isso funciona para um arquivo test.txt que contém

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

Boa resposta, mas \atoca a campainha para mim. Mudei seu segundo comando sed para o sed 's/ /\\033\\a /g'qual não toca a campainha.
falcão

1
Depois de mais testes e encontrar mais inconsistências em diferentes programas de terminal (iTerm, Atom / nuclide), achei melhor apenas colocar $(cat file.txt)aspas duplas e adicionar uma nova linha no final - não há necessidade de sed-so: echo -ne "$(<file.txt)" \\nou echo -ne "$(cat <<"EOF" . . . EOF)" \\n. Isso também impede que o bash execute expansão glob no texto.
falcão

1

Se você não vê a cor dos catcaracteres de controle, provavelmente não está intacto.

Algumas ferramentas retiram os caracteres de controle, mas saem no final.

Comparar:

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

para

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

Você pode reconstruir a sequência de controle do que resta, embora não seja à prova de idiotas, pois o regex que você usa pode acidentalmente atrair sequências de caracteres não intencionais etc. Mas, por exemplo:

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

restauraria a cor na sequência de exemplo.


-1

Deve funcionar por padrão. Por exemplo, se eu faço ls --color=always > /tmp/ae depois cat /tmp/a, vejo as cores. A verificação com odconfirma que o arquivo usa cores ANSI.

Então, acho que você deve verificar se o seu terminal suporta cores ANSI (e elas estão ativadas).


1
Isso não respondeu à pergunta.
Thomas Dickey

1
Não. Less -R resolveu o problema para mim.
Ken Ingram
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.