在Linux 底下有一些指令支援顏色碼(ANSI color codes,可用’man 5 dir_colors’察看顏色碼定義),例如ls:

# ls --color

 

或者是 grep:

# grep ‘foo’ file --colr

 

假設我們有一個目錄,包含了可執行檔與目錄,如果用 ls -l --color 來察看的話,加上顏色的結果,檔案類型一目了然:

# ls –l --color
total 8
-rw-r--r-- 1 jk users    0 2011-05-04 22:21 abc
drwxr-xr-x 2 jk users 4096 2011-05-04 22:21 d1
-rwxr-xr-x 1 jk users    0 2011-05-04 22:20 f1
-rwxr-xr-x 1 jk users    0 2011-05-04 22:21
file
-rw-r--r-- 1 jk users  101 2011-05-04 22:24 ls_r
-rw-r--r-- 1 jk users    0 2011-05-04 22:21 zzz
#

 

但是一旦存成檔案之後就會產生一堆像是亂碼的東西,這時顏色碼反倒變成累贅了:

# ls –l -–color > ls_r

# vi ls_r

^[[00mtotal 4
-rw-r--r-- 1 jk users    0 2011-05-04 22:21 ^[[00mabc^[[00m
drwxr-xr-x 2 jk users 4096 2011-05-04 22:21 ^[[00;34md1^[[00m
-rwxr-xr-x 1 jk users    0 2011-05-04 22:20 ^[[00;32mf1^[[00m
-rwxr-xr-x 1 jk users    0 2011-05-04 22:21 ^[[00;32mfile^[[00m
-rw-r--r-- 1 jk users    0 2011-05-04 22:26 ^[[00mls_r^[[00m
-rw-r--r-- 1 jk users    0 2011-05-04 22:21 ^[[00mzzz^[[00m
^[[m

 

有什麼辦法可以把顏色碼去除呢?

 

因為所有的顏色碼都是以 \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()
{
    sed -r "s/\x1B\[[0-9;]*[mK]//g" $1
}

 

如此,就可輕鬆除去顏色碼:

# rmcolor ls_r
arrow
arrow
    全站熱搜

    dragonspring 發表在 痞客邦 留言(1) 人氣()