如何匹配,然后在其他匹配的第n个匹配后获得输出? 含义:
boo <-first match pattern
art <- second pattern
foo
art
art
two
我希望得到“嘘声”和所有事情,直到第二次出现“艺术”:
boo
art
foo
art
另外,如果第二种模式是空白/换行,我们该怎么做? ;) awk会很有趣..
谢谢!
答案 0 :(得分:1)
使用awk
之类的内容:
awk 'BEGIN{s1=s2=0} $1=="boo"{s1=1} s1==1 && s2<2 {print} $1=="art"{s2++}' file.txt
答案 1 :(得分:0)
awk知道行号,所以:
awk 'NR==2{p2=$0}{print}NR>2&&$0==p2{exit}'
或者,如果boo是一些固定的模式,但艺术是嘘之后的任何东西:
awk '$0=="boo"{n=NR}n&&NR-n==1{p2=$0}{print}n&&NR-n>1&&$0==p2{exit}'
或者如果boo和art都是固定模式:
awk '$0=="boo"{n=NR}n&&NR-n==1&&$0=="art"{p2=$0}{print}n&&NR-n>1&&$0==p2{exit}'
最后,如果第一个boo和art不需要相邻,你想(反复)打印模式中的所有线条(并且只有那些线条)“boo ... art ... art “:
awk '!n&&$0=="boo"{n=1}n{print}n==2&&$0==p2{n=0}n==1&&$0=="art"{n=2;p2=$0}'
答案 2 :(得分:0)
实际上,使用Awk进行这种操作非常容易。我认为你选择了正确的工具。 但盲目地使用该工具更糟糕,我想你可以检查一些Awk http://goo.gl/NkUP3y的基础知识,而不是谷歌搜索单行解决方案或排序。
这是我的快速测试,以满足您的要求并且有效。
⇒ cat test
boo
art
foo
art
art
two
⇒ awk 'BEGIN {m2=0} /boo/ {m1=1; print; next} { if ($1 ~ /art/) { if (m2==1) {print; exit} else { m2=1 } } } { print }' test
boo
art
foo
art
希望这是你想要的。