在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
創作者介紹

真實旅程

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


留言列表 (1)

發表留言
  • 路人丙
  • ls --color=never
    一行打死
  • 嗯,沒錯。針對 'ls' 的顏色可以用 ls --color=never 來除掉顏色。

    不過本篇的重點不在討論 ls 的顏色,而是提供一種方法來除去各式linux 命令產生的顏色(例如 grep)。 ls 只是其中的一個例子。

    dragonspring 於 2012/05/30 11:24 回覆

找更多相關文章與討論

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼