2013-08-01 81 views
53

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

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

./somescript 

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

java (pid 12321) is [email protected][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 [email protected][60G[ OK ] 

我怎么也删除此'@[60G

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

回答

76

According to Wikipedia,哪知道所有的事情,在你使用的是专门用来处理m(颜色命令)和K(命令“删除行的一部分”)的sed命令[m|K]。您的脚本尝试将绝对光标位置设置为60(^[[60G)以获得一行中的所有OK,其中sed行不包括在内。

(正确,[m|K]也许应该是(m|K)[mK],因为你没有尝试匹配管道符。但是现在这并不重要。)

如果交换机的最后一场比赛中你的命令[mGK](m|G|K),你应该能够捕捉到额外的控制顺序。

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

BSD/OSX用户:我们通常没有-r选项来sed。 'brew install gnu-sed'将会安装一个支持的版本。用'gsed'运行。 –

+0

如果我做'echo'$(tput setaf 1)foo $(tput sgr0)bar“| sed -r“s/\ x1B \ [([0-9] {1,2}(; [0-9] {1,2})?)?[mGK] // g”| cat -A',我得到:'foo^O bar $'所以我猜一些字符没有被正确删除,对吧?你知道如何纠正? – edi9999

+1

@ edi9999据我所知,不同之处在于超过16种颜色的颜色设置(如'setaf'支持)需要的参数不止两个;我的正则表达式支持两个。改变第一个'?'出'''应该有所帮助。处理'sgr0'是可能的,但基于搜索,它可能会超出这个基于正则表达式的答案的范围。 –

10

嗯,不知道这是否会为你工作,而“TR”将“脱光”(删除)控制代码 - 尝试:

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

突然它也删除新行 – ruX

+0

是的,LF和CR(代码)是控制代码;如果你对多条线感兴趣,那么这可能不是一个解决方案。既然看起来你正在运行一个JAVA程序,我会猜测颜色是从那里管理的;否则,您需要查看您的控制台设置(即终端设置/配色方案)和/或支持“颜色”的每个命令的选项,即ls --color =从不 –

+0

我喜欢这个优雅的答案,甚至如果它不仅仅是去除颜色。谢谢! –

5

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

它发生,例如用如下输入: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" 
+0

不知道为什么这个答案收到如此少的信用。这是唯一为我工作的... – m8mble

3

@杰夫 - 鲍曼的解决方案帮助我摆脱一些颜色代码。 我增加了一个小的部分,以便在正则表达式来删除一些:

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) 
-5

这个工作对我来说:

./somescript | cat 
+1

这取决于'somescript'的实现方式。它可能会或可能不会认识到它的标准输出是tty。 (罪犯实际上将终端特定的转义代码硬编码到程序中,并且在其他终端或脚本中使用时会严重破坏)。 –

+0

谢谢托比。我用django的manage.py来测试,但你说的是有道理的。 – spiderlama

5

我无法从任何其他的答案中获得不俗的成绩,但以下为我工作:

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

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

+1

在OSX上(BSD sed),扩展正则表达式使用'-E'而不是'-r'。 更多内容可以在[这里]找到(https://unix.stackexchange.com/a/131940) – Assambar