在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/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" |
sed -r "s/\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]//g" |
sed -r "s/\x1B\[[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 |