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