1. 程式人生 > >sed替換字串的貪婪匹配和最小匹配

sed替換字串的貪婪匹配和最小匹配

最近在shell對文字進行操作,遇到了使用sed進行最小匹配的問題。sed預設匹配規則是貪婪匹配。

舉例來說,如果文字內容為:

(aa)bb(cc)

使用sed匹配:

'/(.*)/'

匹配結果為:

(aa)bb(cc)

上述結果即貪婪匹配。

最小匹配的結果是獲取規則字串之間的最小內容,即為:

(aa) (cc)

這兩個結果。

sed獲取最小匹配的方法:

1.通過 [^str] 的方法找到最近的右側匹配規則

2.使用perl代替sed。

舉例:刪除下列字串中的括號和括號中的內容

(a)bb(ccc)dddd(eeeee)f

使用sed的預設方法(貪婪匹配):

#echo "(a)bb(ccc)dddd(eeeee)f" | sed 's/(.*)//g'
#f

使用第一種方法:

#echo '(a)bb(ccc)dddd(eeeee)f' | sed 's/([^)]*)//g'
#bbddddf

使用第二種方法:

#echo "(a)bb(ccc)dddd(eeeee)f" | perl -pe 's/\(.*?\)//g'
#bbddddf

另外發現,sed支援的匹配規則與perl不同,關於字元是否需要轉義也是不一樣的。例如,舉例中的 "(" 和 ")" 在sed中不需要轉義,在perl中則需要轉義。