Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Bash,grep在具有指定字符串的行和字符之间(不包括)_String_Bash_Awk_Sed_Grep - Fatal编程技术网

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得到更多的澄清。@一旦添加了一个解释