最近在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中则需要转义。