2013-06-13 35 views
1

我試圖從字符串中去除着色代碼;例如來自:\033[36;1mDISK\033[0m到:DISKBash正則表達式:用任意數量的字符替換字符串

我正則表達式是這樣的:\033.*?m所以匹配「\ 033」後跟任意數量的字符的,由「M」終止

,當我搜索模式,它找到了匹配; [[ "$var" =~ $regex ]]評估結果爲true

但是,當我嘗試替換匹配時,沒有任何反應,並且返回相同的字符串。

這裏是我完整的腳本:

regex="\033.*?m" 
var="\033[36;1mDISK\033[0m" 

if [[ "$var" =~ $regex ]] 
then 
     echo "matches" 
     echo ${var//$regex} 
else 
     echo "doesn't match!" 
fi 

的問題似乎是與匹配任意數量的正則表達式的任何字符部分。我可以成功替換DISK,但是如果我將其更改爲D.*KD.*?K,則會失敗。

注意在上述所有情況下,模式聲明與字符串匹配,但替換時失敗。不太確定現在該去哪裏,任何幫助表示讚賞。

感謝

+1

'$ {something // something-else}'不適用於正則表達式。你需要做的是在正則表達式中使用捕獲組,然後使用'$ {BASH_REMATCH [1]}'獲取第一個捕獲的子串,依此類推。 – doubleDown

+0

也許你可以以某種方式避免在第一個地方脫色。您是否嘗試過使用「TERM」或「COLORTERM」變量? – mzedeler

回答

1

下應該這樣做:

$ var="\033[36;1mDISK\033[0m" 
$ newvar=$(printf ${var} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g") 
$ echo ${newvar} 

回報:

DISK 

現在驗證!

$ echo $var | od 
0000000 030134 031463 031533 035466 066461 044504 045523 030134 
0000020 031463 030133 005155 
0000026 
$ echo $newvar | od 
0000000 044504 045523 000012 
0000005 
+0

感謝這工作得很好,肯定比我的努力更完整的正則表達式!我不得不做一個小調整:'newvar = $(printf $ {var} | ...'to'newvar = $(printf「$ {var }「| |'別人printf只會通過一個知識產權的第一個字 – milks

+0

很高興知道它的工作! – devnull

1

要使用參數擴展替換運算符,您需要使用擴展的glob。

shopt -s extglob 
newvar=${var//\\033\[*([0-9;])m} 

進行分解:

  • \\033\[ - 符合編碼轉義字符和[
  • *([0-9;]) - 匹配零個或多個數字或分號。您可以使用+([0-9;])(更正確地說)匹配一個或多個數字或分號
  • m - 尾隨m