在Linux 底下有一些指令支援顏色碼(ANSI color codes,可用’man 5 dir_colors’察看顏色碼定義),例如ls:
| # ls --color |
或者是 grep:
| # grep ‘foo’ file --colr |
假設我們有一個目錄,包含了可執行檔與目錄,如果用 ls -l --color 來察看的話,加上顏色的結果,檔案類型一目了然:
|
|
但是一旦存成檔案之後就會產生一堆像是亂碼的東西,這時顏色碼反倒變成累贅了:
|
|
有什麼辦法可以把顏色碼去除呢?
因為所有的顏色碼都是以 \e[ 開頭(其中\e 代表 ESCAPE=ASCII: 0x1B,),以 m 或 K 結束,所以我們可以利用 sed 的『取代』功能,將符合顏色碼的字串去除。從這裡看到有以下三種方法(其實大同小異,而且原文略有錯誤,在此已修正):
| sed -r "s/\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" |
| sed -r "s/\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" |
| sed -r "s/\[[0-9;]*[mK]//g" |
第三種方法看起來較為簡潔,(相對也是對於顏色碼的判斷比較寬鬆)。但儘管如此,也是一長串,平常想要使用時,不太可能記得住。
針對此,我們可以在 ${HOME}/.bashrc 裡面加上一個shell function: rmcolor
| ## Shell function to remove ansi color codes (use 'man 5 dir_colrs' to find ANSI color code definitions) |
如此,就可輕鬆除去顏色碼:
| # rmcolor ls_r |

ls --color=never 一行打死
嗯,沒錯。針對 'ls' 的顏色可以用 ls --color=never 來除掉顏色。 不過本篇的重點不在討論 ls 的顏色,而是提供一種方法來除去各式linux 命令產生的顏色(例如 grep)。 ls 只是其中的一個例子。