打印两个模式(BEGIN和END)之间的最小行集,包括这两个模式的行

时间:2016-09-26 12:47:11

标签: bash perl shell awk sed

输入文件

aaa
Any--END--Pattern
bbb
ANY--BEGIN--PATTERN
ccc                   # do not print
ANY--BEGIN--PATTERN   # print 1
ddd                   # print 2
Any--END--Pattern     # print 3
eee
fff
ANY--BEGIN--PATTERN   # print 4
ggg                   # print 5
Any--END--Pattern     # print 6
hhh                   # print 7
Any--END--Pattern     # print 8
iii                   # do not print
ANY--BEGIN--PATTERN
jjj

想要输出

ANY--BEGIN--PATTERN   # print 1
ddd                   # print 2
Any--END--Pattern     # print 3
ANY--BEGIN--PATTERN   # print 4
ggg                   # print 5
Any--END--Pattern     # print 6
hhh                   # print 7
Any--END--Pattern     # print 8

备注

  • 从当前ANY--BEGIN--PATTERN之前的最新Any--END--Pattern打印。
  • 如果没有Any--END--Pattern见面,请打印到最后ANY--BEGIN--PATTERN

许多类似的问题,但找不到这个问题的答案

我从这些问题中测试的答案打印了行ccc和/或行iii ...或者不打印包含BEGIN和{{1}的行模式。我的几次尝试都有同样的缺点和缺陷。

我们可以写一个十行脚本,但我确信有一个优雅的单行命令解决了这个问题,但我找不到它。因此,我认为这可能是一个很好的问题; - )

我想知道从ENDsedawk或类似Unix的系统上易于使用的任何其他工具可以使用哪些技巧。请使用:或您认为的任何其他工具提供一个小命令行...

编辑:

只是强调来自Sundeep注释的非常简单的命令行,通过反转输入文件来简化问题:

perl

但是这个命令行也打印了开头
(对于寻找类似问题的其他用户可能不会发生这种情况)

tac input.txt | sed -n '/END/,/BEGIN/p' | tac

(此答案在this C++ coding rules内使用)

3 个答案:

答案 0 :(得分:6)

Perl救援!

.setaction label

#!/usr/bin/perl use warnings; use strict; my $last_end; my @buffer; while (<>) { if (/BEGIN/) { print @buffer[ 0 .. $last_end ] if defined $last_end; @buffer = $_; undef $last_end; next; } $last_end = @buffer if @buffer && /END/; push @buffer, $_ if @buffer; } 累积来自BEGIN的行,@buffer指向缓冲区中的最后一个END,这样就可以丢弃不以END结尾的累积行。

作为一个单行(但为什么?):

$last_end

答案 1 :(得分:1)

这适用于sed

String path=Context.getExternalCacheDir()+"file.text";
File file=new File(path)

答案 2 :(得分:1)

$ awk '/BEGIN/{c=0; b=1} {a[c++]=$0} b&&/END/{for(i=0;i<c;i++) print a[i]; delete a; c=0}' file ANY--BEGIN--PATTERN # print 1 ddd # print 2 Any--END--Pattern # print 3 ANY--BEGIN--PATTERN # print 4 ggg # print 5 Any--END--Pattern # print 6 hhh # print 7 Any--END--Pattern # print 8 救援!

<div class="row">
   <div class="offset-md-3 col-md-6"> Some content...
   </div>
</div>