sed或perl实现贪婪匹配和最小匹配
1.sed默认使用贪婪匹配
最近在shell对文本进行操作,遇到了需要对字符串进行最小匹配的问题,但是使用sed默认的匹配规则是贪婪匹配,这里我们就对Linux shell实现最小匹配进行研究。
sed默认是贪婪匹配,使用如下字符串进行举例:
1 | (aa)bb(cc) |
使用sed匹配:
1 | echo "(aa)bb(cc)" | sed 's/(.*)*//g' |
以上命令的输出结果为空。也就是说sed将最大范围的(str)都进行了替换,因此sed的匹配模式是贪婪匹配。
2.最小匹配
最小匹配的结果是获取满足匹配规则的最小内容,如果采用最小匹配,sed的匹配结果应该如下:
1 | bb |
3.使用sed实现最小匹配
sed实现最小匹配的命令如下:
1 | echo '(aa)bb(cc)' | sed 's/([^)]*)*//g' |
4.使用perl实现最小匹配
1 | echo "(aa)bb(cc)" | perl -pe 's/\(.*?\)//g' |
另外,sed支持的匹配规则与perl不同,关于字符是否需要转义也是不一样。例如,举例中的 "(" 和 ")" 在sed中不需要转义,在perl中则需要转义。