程序将STDIN传递到STDOUT并去除了颜色代码?


64

我有一个产生彩色输出的命令,我想将其通过管道输出到一个去除了颜色代码的文件中。cat除了剥离颜色代码外,是否有其他类似的命令?我计划做这样的事情:

$ command-that-produces-colored-output | stripcolorcodes > outfile

4
即使程序的输出被重定向到文件并且不提供将其关闭的选项,程序生成彩色输出也可能是一个错误。我希望isatty(stdin)在执行此操作之前,要检查输出颜色的任何程序。介意分享那个程序是什么?
Alex

通过它cat-我运行的快速测试为我grep --color=auto myusername /etc/passwd提供了我的用户名,红色为白色,否则为白色。 grep --color=auto myusername /etc/passwd | cat给我纯白色的文字
ivanivan '17

1
那不是解决方案。它之所以有效,是因为grep --color=auto避免在标准输出不是终端时产生彩色输出。我说的是无条件输出颜色代码的命令。(正如alex指出的那样,这种行为可以说是一个错误,但是有时我们需要使用不容易修复的不完善软件,而这就是这个问题。)
Ryan Thompson

Answers:


59

您可能会认为有一个实用程序,但是我找不到它。但是,此Perl单行代码应该可以解决问题:

perl -pe 's/\e\[?.*?[\@-~]//g'

例:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

或者,如果您想要一个脚本,则可以另存为stripcolorcodes

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

如果您想要去除只有单独的颜色代码,并留下其他任何ANSI代码(如光标移动),使用

s/\e\[[\d;]*m//g;

而不是我上面使用的替代方法(它将删除所有ANSI转义代码)。


9
如对另一个答案的评论(unix.stackexchange.com/questions/4527/…)所述,此正则表达式是从提取的Term::ANSIColor。请确认您的来源!
forivall 2013年

2
确认您的消息来源!
尔根·保罗(

29

使用GNU sed删除颜色代码(特殊字符)

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

要么

在Python中剥离ANSI转义序列

安装colorama python软件包(pip install colorama)。放入stripcolorcodes

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

运行chmod +x stripcolorcodes


这太棒了。正是我需要的!
adivis12年

Python有点慢,但sed令人印象深刻:)

2
没有尝试使用python,但是sed版本并未去除所有颜色。(我没有进行详尽的测试,但是它保留了一些背景色,因此我选择了更快的perl选项。)
rsaw

22

如果您可以安装Term :: ANSIColor模块,则此perl脚本有效:

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;

5
实际上,这就是我仅使用颜色代码的正则表达式的地方。但是仅仅为一个正则表达式安装整个模块就有点多了。
cjm 2010年

4
嗯,如果您正确设置了cpanm,它将在大约5秒钟内安装该模块。
瑞安·汤普森

无需将脚本写入文件。只需输入:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick

10

如果您的系统可以访问NodeJS,则可以安装以下Node软件包strip-ansi-cli

$ npm install -g strip-ansi-cli

然后,您可以像这样运行命令:

$ command-that-produces-colored-output | strip-ansi > outfile

1
当存在可以使用大多数系统中已经存在的语言和工具的解决方案时,NodeJS是一个巨大的依赖。
user137369

另外,这是列出的最慢的解决方案(请参阅此处),您可能注意到其中的区别。

3

这个sed命令为我做了:

sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g"

例:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile

这似乎不适用于最新版本的sed

3

您可以为此使用交流电。它应该比上面列出的任何东西都要快(尽管perl并且sed应该不错)。这是一个例子:

curl -s wttr.in/LA | ac -s

免责声明:颜色过滤功能由我编写。


3
链接到“ ac”将很有帮助。;)
维塔利·库什纳

ac程序似乎在这里:hub.darcs.net/vmchale/fastcat
Michael Burr

1
$ command-that-produces-colored-output | ansifilter

...如果有必要, (dnf, ...) install ansifilter

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.