我试图在bash中提取特定模式之间的一组行。
我的输入文件:
<?php /* Template Name: CustomPageT1 */ ?>
<?php get_header(); ?>
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<?php
// Start the loop.
while ( have_posts() ) : the_post();
// Include the page content template.
get_template_part( 'template-parts/content', 'page' );
// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) {
comments_template();
}
// End of the loop.
endwhile;
?>
</main><!-- .site-main -->
<?php get_sidebar( 'content-bottom' ); ?>
</div><!-- .content-area -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
我试图仅提取两个=========
a
b
ven
c
d
=========
abc
def
venkata
sad
dada
=========
之间的行,其间包含模式=======
。即,上面的第二部分例如(abc ... dada)。
我尝试了venkata
,但它并没有完全满足我的要求。
我尝试将此任务拆分为分别在sed
及其下方的行上划线。
使用venkata
从输入的开头开始,这不是我需要的。
有什么想法吗?
修改:sed -n -e '/=====/,/venkata/p'
之间的行数可以是任意数字,=======
可以是任意行,不一定是确切的中间行。
每行可以有多个单词,数字,符号。这只是一个样本
编辑2: How to select lines between two marker patterns which may occur multiple times with awk/sed已接受的答案已关闭,但会提供第一场比赛的输出。这不是我要找的
根据该问题的答案中的命令,它将在找到第一个venkata
时设置标志。
我需要在====
之前====
,这不一定是第一场比赛
这个答案无法解决我的问题
答案 0 :(得分:0)
使用gnu-awk
即可:
awk -v RS='={2,}\n' -v ORS= '/venkata/' file
abc
def
venkata
sad
dada
如果您没有gnu-awk
,请使用:
awk '/={2,}/{if (s && data ~ /venkata/) printf "%s", data; s=1; data=""; next} s{data = data $0 RS}' file
答案 1 :(得分:0)
使用grep
您可以完成相同的操作:
cat infile | grep -A 2 -B 2 "venkata"
选项-A
和-B
分别打印多个尾随行和前导行。
正如@Jan Gassen指出的那样,如果你想要匹配模式之下的相同数量的行,你可以通过以下方式使它变得更简单:
cat infile | grep -C 2 "venkata"