perl - 命令行 perl 仅在最后一次匹配的模式之间打印行
问题描述
我正在寻找一个 perl one liner 命令来获取具有非贪婪匹配模式的行。模式 1 一些信息
文本1
文本2
TEXT3 PATTERN2 一些信息
模式 1 一些信息
文本4
文本5
TEXT6 PATTERN3 一些信息
我知道以下代码 perl -ne 'print if (/PATTERN1/../PATTERN3/)' 是一个贪婪的匹配并打印所有内容。
我想要的是打印以下输出 PATTERN1 SOME INFO TEXT4 TEXT5 TEXT6 PATTERN3 SOME INFO
请注意,这是一个非常大的文件,不能将整个文件放入一个字符串中。
谢谢,拉维
解决方案
您不能真正“重新启动”触发器运算符,因为它太简单了。它停止寻找开始条件,直到满足结束条件。此外,您每行运行一次该代码,因此当您到达第二行时,PATTERN1
前面的行已经打印到输出中。这意味着做你想做的事情你需要做两件事:扩展算法以便你可以自定义它,并在打印输出之前处理整个输入(这并不一定意味着将它们全部读入一个字符串,但你必须缓冲您正在查看的部分,直到您知道是否打印它)。
use strict;
use warnings;
my ($in_section, @buffer);
while (my $line = readline) {
$in_section = 1, undef @buffer if $line =~ m/PATTERN1/;
push @buffer, $line if $in_section;
$in_section = 0, print @buffer if $line =~ m/PATTERN3/;
}
作为oneliner,它可能看起来像:
perl -nE 'our ($in, @buf); $in = 1, undef @buf if /PATTERN1/;
push @buf, $_ if $in; $in = 0, print @buf if /PATTERN3/'