sed或perl实现贪婪匹配和最小匹配

1.sed默认使用贪婪匹配

最近在shell对文本进行操作,遇到了需要对字符串进行最小匹配的问题,但是使用sed默认的匹配规则是贪婪匹配,这里我们就对Linux shell实现最小匹配进行研究。

sed默认是贪婪匹配,使用如下字符串进行举例:

1
(aa)bb(cc)

使用sed匹配:

1
2
echo "(aa)bb(cc)" | sed 's/(.*)*//g'

以上命令的输出结果为空。也就是说sed将最大范围的(str)都进行了替换,因此sed的匹配模式是贪婪匹配。

2.最小匹配

最小匹配的结果是获取满足匹配规则的最小内容,如果采用最小匹配,sed的匹配结果应该如下:

1
bb

3.使用sed实现最小匹配

sed实现最小匹配的命令如下:

1
2
echo '(aa)bb(cc)' | sed 's/([^)]*)*//g'
bb

4.使用perl实现最小匹配

1
2
echo "(aa)bb(cc)" | perl -pe 's/\(.*?\)//g'
bb

另外,sed支持的匹配规则与perl不同,关于字符是否需要转义也是不一样。例如,举例中的 "(" 和 ")" 在sed中不需要转义,在perl中则需要转义。