这个问题与
this非常相似,只是我希望尽快做到这一点,只做一次(不幸的是gzip压缩)文件.
给定模式CAPTURE和输入
1:......... ........... 100:CAPTURE ........... 150:CAPTURE ........... 200:CAPTURE ........... 1000:......
打印:
100:CAPTURE ........... 150:CAPTURE ........... 200:CAPTURE
这可以用正则表达式完成吗?
我依稀记得这种语法不能被正则表达式捕获,但不太确定,因为正规表达式现在可以提供前瞻性等等.
解决方法
您可以缓冲线条,直到看到包含CAPTURE的行,特别处理第一次出现的模式.
#!/usr/bin/env perl use warnings; use strict; my $first=1; my @buf; while ( my $line = <> ) { push @buf,$line unless $first; if ( $line=~/CAPTURE/ ) { if ($first) { @buf = ($line); $first = 0; } print @buf; @buf = (); } }
通过zcat file.gz |将输入提供给该程序perl script.pl.
如果需要的话,当然可以将其塞入单线中……
zcat file.gz | perl -ne '$x&&push@b,$_;if(/CAPTURE/){$x||=@b=$_;print@b;@b=()}'
Can this be accomplished with a regular expression?
你的意思是一次性,一次正则表达式?如果你不介意将整个文件读入内存,当然……但对于大文件来说这显然不是一个好主意.
zcat file.gz | perl -0777ne '/((^.*CAPTURE.*$)(?s:.*)(?2)(?:\z|\n))/m and print $1'