2013-08-01 80 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