Bash,grep在指定字符串的行之间直到字符(不包括)

时间:2016-01-21 06:28:52

标签: string bash awk sed grep

示例:

> 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

4 个答案:

答案 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

这会将标题行存储在保留空间中,然后将标题附加到每一行,并仅在匹配项上打印。