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

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

我有一个生成彩色输出的命令,我想将其通过管道传输到一个文件中,并删除颜色代码。是否有一个命令的工作原理类似cat,只是它会去除颜色代码?我计划做这样的事情:

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

答案1

你可能会认为有一个实用程序可以实现这一点,但我找不到它。然而,这个 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 转义码)。

答案2

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

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

或者

在 Python 中去除 ANSI 转义序列

安装色拉玛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

答案3

如果您可以安装术语::ANSIColor模块,这个 perl 脚本可以工作:

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

答案4

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

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

相关内容