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}的行模式。我的几次尝试都有同样的缺点和缺陷。
我们可以写一个十行脚本,但我确信有一个优雅的单行命令解决了这个问题,但我找不到它。因此,我认为这可能是一个很好的问题; - )
我想知道从END
,sed
,awk
或类似Unix的系统上易于使用的任何其他工具可以使用哪些技巧。请使用:bash,grep,sed,awk,perl或您认为的任何其他工具提供一个小命令行...
只是强调来自Sundeep注释的非常简单的命令行,通过反转输入文件来简化问题:
perl
但是这个命令行也打印了开头
(对于寻找类似问题的其他用户可能不会发生这种情况)
tac input.txt | sed -n '/END/,/BEGIN/p' | tac
(此答案在this C++ coding rules内使用)
答案 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>