Regex Grep等:重叠匹配

Regex Grep等:重叠匹配,regex,grep,Regex,Grep,用于: 我得到: echo "the quick brown fox" | grep -Po '[a-z]+ [a-z]+' 但我想: the quick brown fox 如何使用?使用awk: the quick quick brown brown fox 输出: #!/usr/bin/python3.5 import re s="the quick brown fox" matches = re.finditer(r'(?=(\b[a-z]+\b \b[a-z]+\b))',s)

用于:

我得到:

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

the quick
brown fox
如何使用?

使用
awk

the quick
quick brown
brown fox
输出:

#!/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)
另一个awk:

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

awk'{print$1,$2rs$2,$3rs$3,$4}'只需重复使用原始解决方案即可获得马尔可夫链:

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

    the quick
    quick brown
    brown fox
第二行(即sed)删除输入的第一个字。因此,命令的其余部分将生成缺少的对

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

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]+'
echo pattern1pattern2 | sed”:开始;s/\(模式1\)\(模式2\)/\2/;t启动“|grep-o”]*>“|tr-d”|”
此解决方案将使用部分重叠的模式,其中
pattern2
可以被下一个匹配重叠。它假定
|
为保留辅助字符。此外,它还假设
pattern1pattern2
regex无法匹配任何单独由
pattern2
匹配的字符串


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

我不是专家,但我不认为你能用grep做到这一点。您应该尝试编写一个perl或awk脚本。使用perl,您可以轻松地完成这项工作,而不是使用grep,因为grep不允许访问捕获组内容。如果您使用可以打印组的内容,则重叠模式是
([a-z]+)(?=([a-z]+)
打印
$1$2
的最终目标是什么?要匹配每一对连续的单词?可能会有奇数的单词或中间的一些数字吗?这个问题的目的是更一般的意义。我想我没有说清楚。一般来说,我希望以返回所有可能匹配项的方式对输入运行正则表达式。我看到的行为不会返回“quick brown”,即使它是一个有效的匹配项。我在30秒前的上述评论也适用于这里。
-Po
的意思与OP的意思相同(即Perl Regexp表示-P,而-o表示“仅输出匹配”)。正则表达式也完全相同。但是,我将添加对sed的解释。。。
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]+'
 echo pattern1pattern2 | sed ':start;s/\(pattern1\)\(pattern2\)/<\1|\2>\2/;t start' | grep -o '<[^>]*>' | tr -d '<>|'