如何使用grep/perl/awk实现正则表达式的重叠匹配
方案1:awk实现(空格分隔场景最优)
直接遍历文本字段输出相邻词对,逻辑最简单,性能最高,适配所有awk版本:
echo "bob mary mike bill kim jim john" | awk '{for(i=1;i<NF;i++) print $i, $(i+1)}'
输出结果完全符合需求:
bob mary mary mike mike bill bill kim kim jim jim john
方案2:Perl正则实现(通用重叠匹配场景)
如果是更复杂的非空格分隔的重叠匹配需求,用零宽正向先行断言实现,不需要修改原有正则逻辑:
echo "bob mary mike bill kim jim john" | perl -ne 'while(/(?=(\b[a-z]+ [a-z]+\b))/g) { print "$1\n" }'
原理说明:(?=)是零宽正向先行断言,匹配时不会消耗字符串的字符,每次匹配完成后指针仅向后移动1位,因此可以捕获到重叠的匹配结果,捕获组$1存储每次匹配到的双词结果。
补充:GNU grep 实现(仅GNU环境可用)
如果仅限GNU环境使用,也可以直接用grep的-P参数实现:
echo "bob mary mike bill kim jim john" | grep -oP '(?=(\b[a-z]+ [a-z]+\b))\1'
这个方案兼容性不如前两个,优先推荐awk或Perl实现。
内容的提问来源于stack exchange,提问作者RobD
相关产品推荐
相关产品推荐

