sed替換字串的貪婪匹配和最小匹配
阿新 • • 發佈:2019-02-18
最近在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中則需要轉義。