在Unix中删除ANSI颜色转义的最佳方法

我有一个perl progaram其打印输出的颜色。 如果我rediect文件中的输出,并在vi中打开我看到颜色特殊字符。 像这样的东西。

^[[31;43mAnd this is red on_yellow too^[[0m 

从输出文件中删除此颜色字符的最佳方法是什么?

谢谢

更新:

我尝试了正则expression式。 这个对我有用:

  cat -va|head ^[[30;41mThis is black on_red^[[0m ^[[30;41mAnd this is black on_red too^[[0m ^[[30;42mThis is black on_green^[[0m ^[[30;42mAnd this is black on_green too^[[0m ^[[30;43mThis is black on_yellow^[[0m ^[[30;43mAnd this is black on_yellow too^[[0m ^[[30;44mThis is black on_blue^[[0m ^[[30;44mAnd this is black on_blue too^[[0m ^[[30;45mThis is black on_magenta^[[0m ^[[30;45mAnd this is black on_magenta too^[[0m $ cat -va|head|perl -lane 's/\^\[\[\d+(;\d+)*m//g; print' This is black on_red And this is black on_red too This is black on_green And this is black on_green too This is black on_yellow And this is black on_yellow too This is black on_blue And this is black on_blue too This is black on_magenta And this is black on_magenta too 

Solutions Collecting From Web of "在Unix中删除ANSI颜色转义的最佳方法"

Perl模块Term::ANSIColor提供了一个函数Term::ANSIColor colorstrip()来做到这一点。 例如,

 ls --color | perl -MTerm::ANSIColor=colorstrip -ne 'print colorstrip($_)' 

modulee Term::ANSIColor是Perl核心的一部分。

巧合的是,我只需要解决这个问题,这是我提出的正则表达式:

 while (<>) { s/\e\[[\d;]*[a-zA-Z]//g; print; } 

我只是通过检查一些输出示例(特别是grep --color=always ...的输出)来推导出来的,所以它可能不会涵盖你所期望的所有转义。

根据这个网站上的信息,最后一个字符类可能会从[a-zA-Z]缩短为[mK]