从输出中去除颜色
我有一些脚本产生的颜色,我需要摆脱这一点。
#!/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