String Bash,grep在具有指定字符串的行和字符之间(不包括)
例如:String Bash,grep在具有指定字符串的行和字符之间(不包括),string,bash,awk,sed,grep,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 >...... 在这里,我希望grep带有“abc”的行,并且在另一行“”之前的所有行,结果应该如下所示: > header abc and blabla
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header bcf and blablabla
some_lines4
some_lines5
> header abc and blablabla
some_lines6
>......
在这里,我希望grep带有“abc”的行,并且在另一行“”之前的所有行,结果应该如下所示:
> 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
some_lines1
some_lines2
some_lines3
some_lines6
另一个sed:
sed -n '/abc/,/>/{/abc/b;/>/b;p}' file
不想要的结果:
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header bcf and blablabla
> header abc and blablabla
some_lines6
some_lines1
some_lines2
some_lines3
some_lines6
您可以使用
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
使用GNU grep:
grep -Poz '^> .*abc.*(\n[^>].*)*' file
输出:
> header abc and blablabla
some_lines1
some_lines2
some_lines3
> header abc and blablabla
some_lines6
在sed中
:1;n、 /^>/!b1
是一个循环
:1
是标签n
打印当前行并将下一行加载到图案空间/>/代码>检查模式空间不包含
,如果不包含,则执行下一个命令
b1
返回到循环的开始处这可能适合您(GNU-sed):
这会将标题行存储在保留空间中,然后将标题附加到每一行并仅在匹配项上打印。但我的系统似乎不支持-Poz-z
进行多行grepping!非常整洁。@once:这是一个简单的awk。当我们在一行中找到abc
时,标志p
设置为1
,当我们在一行开始处找到^
时,它重置为0
。最后使用p
只打印或跳过一行,这取决于它的值为1或0。这不会为任何包含abc的行设置标志,而不仅仅是以
开头的行。我相信这是OP想要的,但最好我们从OP得到更多的澄清。@一旦添加了一个解释