Mam plik z kolorami ANSI.
test.txt:
\e[0;31mExample\e[0m
Chciałbym wyświetlić zawartość tego pliku w terminalu, podobnie jak cat
robi, ale chciałbym również wyświetlić kolory.
cat
druk?
echo -e $(cat test.txt)
.
Mam plik z kolorami ANSI.
test.txt:
\e[0;31mExample\e[0m
Chciałbym wyświetlić zawartość tego pliku w terminalu, podobnie jak cat
robi, ale chciałbym również wyświetlić kolory.
cat
druk?
echo -e $(cat test.txt)
.
Odpowiedzi:
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
\a
dzwoni do mnie. Zmieniłem twoje drugie polecenie sed, na sed 's/ /\\033\\a /g'
które nie dzwoni dzwonek.
$(cat file.txt)
podwójne cudzysłowy i dodawać nowy wiersz na końcu - bez potrzeby sed - tak: echo -ne "$(<file.txt)" \\n
lub echo -ne "$(cat <<"EOF" . . . EOF)" \\n
. Zapobiega to również wykonywaniu przez bash ekspansji globalnej w tekście.
Jeśli nie widzisz kolorów z cat
kontrolnych 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.
Powinno działać domyślnie. Np jeśli robię ls --color=always > /tmp/a
i nie cat /tmp/a
widzę kolory. Sprawdzanie za pomocą od
potwierdza, ż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).
less -R
, na przykład.