使用bash中的分隔符提取行集

时间:2018-01-31 12:07:52

标签: bash

我试图在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时设置标志。 我需要在====之前====,这不一定是第一场比赛 这个答案无法解决我的问题

2 个答案:

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