示例:
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header bcf and blablabla
some_lines4
some_lines5
> header abc and blablabla
some_lines6
>......
在这里,我想要使用' abc '以及在其他'> '之后的所有行的grep,结果应该是:
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header abc and blablabla
some_lines6
> ...
由于两者之间的行数不固定,我无法应用grep -A
我也尝试过使用sed,但效果不好:
sed -n '/abc/,/>/p' file
不需要的结果:
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header bcf and blablabla
> header abc and blablabla
some_lines6
另一个sed:
sed -n '/abc/,/>/{/abc/b;/>/b;p}' file
不需要的结果:
some_lines1
some_lines2
some_lines3
some_lines6
答案 0 :(得分:4)
使用GNU grep:
grep -Poz '^> .*abc.*(\n[^>].*)*' file
输出:
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header abc and blablabla
some_lines6
答案 1 :(得分:3)
您可以使用awk
:
awk '/^>/{p=0} /abc/{p=1} p' file
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header abc and blablabla
some_lines6
答案 2 :(得分:1)
在sed
sed '/abc/{:1;n;/^>/!b1};d' file
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header abc and blablabla
some_lines6
:1;n;/^>/!b1
是一个循环
:1
是标签
n
打印当前行并将下一行加载到模式空间
中
/>/!
检查模式空间不包含>
,如果没有,则执行下一个命令
b1
回到循环的开头
答案 3 :(得分:1)
这可能适合你(GNU sed):
sed '/^>/h;G;/^>.*abc/MP;d' file
这会将标题行存储在保留空间中,然后将标题附加到每一行,并仅在匹配项上打印。