gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:16:11 24 4
gpt4 key购买 nike

这个问题和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 脚本.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 - 在单次迭代中提取同一模式第一次出现和最后一次出现之间的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50728135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com