使用T恤输出时保持颜色

时间:2012-11-06 16:50:17

标签: bash

我正在尝试获取程序的输出(有颜色)并用tee输出。我希望输出在终端(stdout)上有颜色,但不在输出文件上。这可能吗?

2 个答案:

答案 0 :(得分:3)

一种可能的方法是,在stderr上打印转义字符,& stdout的主要内容。我在其中一个脚本中完成了它。它当然不是一个可扩展的选项。

编写一个专用脚本是一个有趣的练习,该脚本解析stdin,将转义序列放在stderr&其他人在stdout上。 :-)
然后 ./myScript.sh | filter_escapes | tee outfile.log
我没有看到任何可以做到这一点的脚本,但我认为,编写一个脚本(如果尚未提供)会很有趣。

就你的问题而言,我认为下面的内容应该足够了:

ls --color=always | sed -r 'w /dev/stderr' | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/test

用./your_script&替换ls --color=always /tmp/test包含您想要的输出文件名。

其他实施:

ls --color=always | tee >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/abcd)

注意:tee >(sed .... > logfile)语法

注意:
1.正则表达式从sampson-chen的答案借来 2. sed中/ dev / stderr的w命令是GNU sed的补充。

答案 1 :(得分:0)

是的,这是可能的。通过sed将要输入的结果传递到输出文件中,以删除格式化颜色时使用的转义字符:

在Linux上:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 

在OS X上,因为它不是GNU sed:

sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 

我最近编写的工具的一部分与您在tee中描述的完全相同:

https://github.com/sampson-chen/sack/blob/master/sack

 ack --color $sack__flags $@ $sack__cwd | tee >$sack__dev_null >(display_shortcuts) >(process_shorcut_paths | remove_escaped_chars > $sack__shortcut_file)

其中函数remove_escaped_chars包含操作系统版本检查,然后应用sed脚本,如上所示。

(注1:tee自动将输出的副本重定向到stdout,因此我使用>$sack__dev_null来防止这种情况:因为我想在打印到stdout的内容中添加其他信息,如函数display_shortcuts

(注2:tee本身在使用时绝对不会删除颜色格式:我怀疑是其他工具的管道默认行为。)

相关问题