显示具有ANSI颜色的文件


12

我有一个ANSI颜色的文件。

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

我想像在终端一样在终端中显示此文件的内容cat,但是我也想显示颜色。


4
less -R例如,使用。
Thomas Dickey

你的cat印刷品是什么?
techraf 2016年

1
OP的问题有太多可能的答案,很有趣。从开始echo -e $(cat test.txt)
Thomas Dickey

Answers:


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)" \\necho -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/acat /tmp/a,我会看到颜色。进行检查,od确认该文件使用ANSI颜色。

因此,我认为您应该检查终端是否支持ANSI颜色(并且已启用)。


1
这没有回答问题。
Thomas Dickey

1
不,少-R实际上为我解决了这个问题。
肯·英格拉姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.