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中則需要轉義。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM