Grep之类:重叠匹配

时间:2017-06-13 14:34:11

标签: regex grep

有关:

echo "the quick brown fox" | grep -Po '[a-z]+ [a-z]+'

我明白了:

the quick
brown fox

但我想:

the quick
quick brown
brown fox

如何?

3 个答案:

答案 0 :(得分:2)

awk

 awk '{for(i=1;i<NF;i++) print $i,$(i+1)}' <<<"the quick brown fox"

<强>更新: 用python:

#!/usr/bin/python3.5
import re
s="the quick brown fox"
matches = re.finditer(r'(?=(\b[a-z]+\b \b[a-z]+\b))',s)
ans=[i.group(1) for i in matches]
print(ans) #or not print
for i in ans:
    print(i)

输出:

['the quick', 'quick brown', 'brown fox']
the quick
quick brown
brown fox

答案 1 :(得分:1)

只需重用原始解决方案即可获得马尔可夫链:

echo "the quick brown fox" | grep -Po '[a-z]+ [a-z]+'
echo "the quick brown fox" | sed 's/^[a-z]* //' | grep -Po '[a-z]+ [a-z]+'

第二行(即sed)删除输入的第一个单词。因此,该命令的其余部分将生成缺少的对。

使用sed运行循环的能力,也可以推广相同的方法:

 echo pattern1pattern2 | sed ':start;s/\(pattern1\)\(pattern2\)/<\1|\2>\2/;t start' | grep -o '<[^>]*>' | tr -d '<>|'

此解决方案将与部分重叠的模式一起使用,其中pattern2可以在下一个匹配项中重叠。它假定<>|是保留的辅助字符。此外,它假定pattern1pattern2正则表达式不能与任何单独由pattern2匹配的字符串匹配。

sed将pattern1pattern2替换为<pattern1|pattern2>pattern2,并在发现任何匹配项时重复进行此替换(分支t命令允许匹配先前替换的字符串,与g不同选项)。也就是说,在每次迭代中,一个<pattern1|pattern2>组都被留下来指示我们的匹配项,而pattern2的实例仍然可以在下一个匹配项中进行匹配。最后,我们使用原始方法选择组并去除辅助标记。

答案 2 :(得分:0)

另一个awk:

awk '{print $1,$2 RS $2,$3 RS $3,$4}' <<<"the quick brown fox"

    the quick
    quick brown
    brown fox