Показать файл с цветами ANSI

12

У меня есть файл с цветами ANSI.

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

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

Боб Дилан
источник
4
Используя less -R, например.
Томас Дики
Что у тебя на catпринте?
Techraf
1
На вопрос ОП было слишком много возможных ответов, чтобы быть интересным. Начните с echo -e $(cat test.txt).
Томас Дики

Ответы:

10

Я искал решение этого точного вопроса Bash. Я чуть не пропустил комментарий @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 выполнил расширение glob в тексте.
Ястреб
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"

восстановил бы цвет к строке примера.

Catskul
источник
-1

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

Поэтому я думаю, что вы должны проверить, поддерживает ли ваш терминал цвета ANSI (и они включены).

Джакомо Катенацци
источник
1
Это не ответило на вопрос.
Томас Дики
1
№ меньше -R на самом деле решил проблему для меня.
Кен Ингрэм