Wyświetl plik z kolorami ANSI


12

Mam plik z kolorami ANSI.

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

Chciałbym wyświetlić zawartość tego pliku w terminalu, podobnie jak catrobi, ale chciałbym również wyświetlić kolory.


4
Korzystanie z less -R, na przykład.
Thomas Dickey,

Co robi twój catdruk?
techraf

1
Pytanie OP miało zbyt wiele możliwych odpowiedzi, aby mogło być interesujące. Zacznij od echo -e $(cat test.txt).
Thomas Dickey,

Odpowiedzi:


10

Szukałem rozwiązania dokładnie tego pytania o bash. Prawie nie zauważyłem komentarza @Thomas Dickey, który dostarczył mi najbardziej eleganckiego rozwiązania.

echo -e $(cat test.txt)

Niektóre rzeczy, które nie zadziałały dla mnie to (najwyraźniej nie można potokować rzeczy do echa)

cat test.txt | echo -e

lub

less -R test.txt

Innym problemem, jaki miałem, było to, że echo -e nie drukowało ładnie nowych linii i sąsiadujących białych znaków w pliku. Aby je wydrukować, użyłem następujących.

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

Działa to dla pliku test.txt zawierającego

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

Dobra odpowiedź, ale \adzwoni do mnie. Zmieniłem twoje drugie polecenie sed, na sed 's/ /\\033\\a /g'które nie dzwoni dzwonek.
jastrząb

1
Po dalszych testach i znalezieniu większej niespójności w różnych programach terminalowych (iTerm, Atom / nuclide), znalazłem, że najlepiej jest zawijać $(cat file.txt)podwójne cudzysłowy i dodawać nowy wiersz na końcu - bez potrzeby sed - tak: echo -ne "$(<file.txt)" \\nlub echo -ne "$(cat <<"EOF" . . . EOF)" \\n. Zapobiega to również wykonywaniu przez bash ekspansji globalnej w tekście.
jastrząb

1

Jeśli nie widzisz kolorów z catkontrolnych znaków, prawdopodobnie nie są one nienaruszone.

Niektóre narzędzia usuwają znaki kontrolne, ale pozostawiają na końcu.

Porównać:

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

do

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

Być może będziesz w stanie odbudować sekwencję kontrolną z tego, co zostało, ale nie jest to głupi dowód, ponieważ regex, którego używasz, może przypadkowo przyciągnąć niezamierzone sekwencje znaków itp. Ale na przykład:

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

przywróci kolor do przykładowego ciągu.


-1

Powinno działać domyślnie. Np jeśli robię ls --color=always > /tmp/ai nie cat /tmp/awidzę kolory. Sprawdzanie za pomocą odpotwierdza, że ​​plik używa kolorów ANSI.

Myślę więc, że powinieneś sprawdzić, czy twój terminal obsługuje kolory ANSI (i są one włączone).


1
To nie odpowiedziało na pytanie.
Thomas Dickey,

1
Nie. Mniej -R faktycznie rozwiązało problem dla mnie.
Ken Ingram
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.