perl – 在单次迭代中提取同一模式的第一次和最后一次出现之间的所有内容

前端之家收集整理的这篇文章主要介绍了perl – 在单次迭代中提取同一模式的第一次和最后一次出现之间的所有内容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题与 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'

猜你在找的Perl相关文章