将 STDIN 传递给 STDOUT 并去除颜色代码的程序?

Rya*_*son 67 colors pipe filter

我有一个生成彩色输出的命令,我想将它通过管道传输到一个文件中,并去掉颜色代码。cat除了去除颜色代码之外,是否有类似的命令?我打算做这样的事情:

$ command-that-produces-colored-output | stripcolorcodes > outfile
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 62

你会认为会有一个实用程序,但我找不到它。但是,这个 Perl one-liner 应该可以解决问题:

perl -pe 's/\e\[?.*?[\@-~]//g'
Run Code Online (Sandbox Code Playgroud)

例子:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile
Run Code Online (Sandbox Code Playgroud)

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

#! /usr/bin/perl

use strict;
use warnings;

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

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

s/\e\[[\d;]*m//g;
Run Code Online (Sandbox Code Playgroud)

而不是我上面使用的替换(删除了所有 ANSI 转义码)。

  • 正如对另一个答案的评论中提到的(http://unix.stackexchange.com/questions/4527/program-that-passes-stdin-to-stdout-with-color-codes-stripped#4531),这个正则表达式被拉出来自`Term::ANSIColor`。请承认您的来源! (10认同)
  • 承认你的来源! (2认同)

jfs*_*jfs 32

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

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

或者

在 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)
Run Code Online (Sandbox Code Playgroud)

运行chmod +x stripcolorcodes

  • 没有尝试 python,但 sed 版本不会去除所有颜色。(我没有进行详尽的测试,但它保留了一些完整的背景颜色,所以我选择了更快的 perl 选项。) (2认同)

Rya*_*son 22

如果你可以安装Term::ANSIColor模块,这个 perl 脚本就可以工作:

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

  • 这实际上是我获得仅颜色代码的正则表达式的地方。但是只为那个正则表达式安装整个模块有点多。 (6认同)
  • 嗯,如果你正确设置了 cpanm,它会在大约 5 秒内安装模块。 (4认同)

小智 11

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

$ npm install -g strip-ansi-cli
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样运行你的命令:

$ command-that-produces-colored-output | strip-ansi > outfile
Run Code Online (Sandbox Code Playgroud)

  • 当存在可以使用大多数系统中已经存在的语言和工具的解决方案时,NodeJS 是一个巨大的依赖项。 (3认同)