Відобразити файл з ANSI кольорами


12

У мене файл з кольорами ANSI.

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

Я хотів би відобразити вміст цього файлу в терміналі, як catце робиться, але я також хотів би відобразити кольори.


4
Використовуючи less -R, наприклад,
Томас Дікі

Що означає ваш catдрук?
techraf

1
На питання ОП було занадто багато можливих відповідей, щоб бути цікавим. Почніть з echo -e $(cat test.txt).
Томас Дікі

Відповіді:


10

Я шукав рішення цього точного баш-питання. Я ледь не пропустив коментар @Thomas Dickey, який дав мені найелегантніше рішення.

echo -e $(cat test.txt)

Деякі речі, які для мене не спрацювали (мабуть, ти не можеш реагувати на відгуки)

cat test.txt | echo -e

або

less -R test.txt

Іншим питанням було те, що echo -e не надрукував друковані рядки та суміжні пробіли у файлі. Для їх друку я використав наступне.

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

Це працює для файлу test.txt, що містить

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

Гарна відповідь, але \aдзвонить у дзвони для мене. Я змінив вашу другу команду sed, на sed 's/ /\\033\\a /g'яку не дзвонить дзвін.
яструб

1
Після подальшого тестування та виявлення більшої кількості невідповідностей у різних термінальних програмах (iTerm, Atom / nuclide), я вважав, що найкраще просто загортати $(cat file.txt)в подвійні лапки та додавати нову рядок наприкінці - не потрібно в sed - так: echo -ne "$(<file.txt)" \\nабо echo -ne "$(cat <<"EOF" . . . EOF)" \\n. Це також заважає bash виконувати глобальне розширення в тексті.
яструб

1

Якщо ви не бачите колір catу контрольних символів, ймовірно, недоторканий.

Деякі інструменти викреслюють контрольні символи, але залишають у кінці.

Порівняйте:

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

до

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

Можливо, ви зможете відновити керуючу послідовність із того, що залишилося, хоча це не дурний доказ, оскільки використовуваний регулярний вираз може випадково втягнути в себе ненавмисні послідовності символів тощо. Але, наприклад:

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

відновив би колір у рядку прикладу.


-1

Він повинен працювати за замовчуванням. Наприклад, якщо я це роблю ls --color=always > /tmp/aі тоді cat /tmp/a, я бачу кольори. Перевірка з odпідтверджує, що файл використовує кольори ANSI.

Тому я думаю, вам слід перевірити, чи підтримує ваш термінал кольори ANSI (і вони включені).


1
Це не дало відповіді на запитання.
Томас Дікі

1
Ні менше - R насправді вирішив питання для мене.
Кен Інграм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.