格雷普或类似的东西:重叠的比赛

  • 本文关键字:重叠 雷普 regex grep
  • 更新时间 :
  • 英文 :


For :

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

我得到:

the quick
brown fox

但我想要:

the quick
quick brown
brown fox

如何?

withawk

awk '{for(i=1;i<NF;i++) print $i,$(i+1)}' <<<"the quick 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)

输出:

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

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

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的实例仍然可以在下一个匹配中匹配。最后,我们使用原始方法选择组并去除辅助标记。

另一个尴尬:

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

最新更新