从输出中去除颜色

我有一些脚本产生的颜色,我需要摆脱这一点。

#!/bin/bash exec > >(tee log) # redirect the output to a file but keep it on stdout exec 2>&1 ./somescript 

输出是(在日志文件中):

 java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m] 

我不知道如何把ESC字符放在这里,所以我把@放在了原位。

我将脚本改为:

 #!/bin/bash exec > >(tee log) # redirect the output to a file but keep it on stdout exec 2>&1 ./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 

但现在它给了我(在日志文件中):

 java (pid 12321) is running...@[60G[ OK ] 

我怎样才能删除这个' @[60G

也许有一种方法可以完全禁用整个脚本的着色?

根据知道所有事情的维基百科 ,您正在使用的sed命令中的[m|K]是专门为处理m (颜色命令)和K (“擦除部分行”命令)而devise的。 你的脚本试图将绝对光标位置设置为60( ^[[60G ))以获得一行中所有的OK,这是你的sed行不包含的。

(当然, [m|K]可能应该是(m|K)[mK] ,因为你并不是想要匹配一个pipe道angular色,但是现在这并不重要。

如果将命令中的最终匹配切换为[mGK](m|G|K) ,则应该能够捕捉到额外的控制序列。

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

嗯,不知道这是否适合你,但'TR'会'剥离'(删除) 控制代码 – 请尝试:

 ./somescript | tr -d '[:cntrl:]' 

我也有问题,有时候,SI字符出现了。

它发生在这个input的例子: echo "$(tput setaf 1)foo$(tput sgr0) bar"

这里有一个方法来剥离SI字符(移入)(0x0f)

 ./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g" 

@ jeff-bowman的解决scheme帮助我摆脱了一些颜色代码。 我添加了另一个小部分的正则expression式,以删除更多:

 sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # Original. Removed Red ([31;40m[1m[error][0m) sed -r "s/\x1B\[([0-9];)?([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # With an addition, removed yellow and green ([1;33;40m[1m[warning][0m and [1;32;40m[1m[ok][0m) ^^^^^^^^^ remove Yellow and Green (and maybe more colors) 

我从其他答案中得不到像样的结果,但是下面的结果对我有用:

 somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" 

如果我只删除了控制字符“^ [”,则剩下颜色数据的其余部分,例如“33m”。 包括颜色代码和“米”做的伎俩。 我很困惑s / \ x1B // g不起作用,因为\ x1B [31m当然可以和echo一起工作。

这适用于我:

 ./somescript | cat