首页 > 解决方案 > 命令行 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

请注意,这是一个非常大的文件,不能将整个文件放入一个字符串中。

谢谢,拉维

标签: perlcommand-line

解决方案


您不能真正“重新启动”触发器运算符,因为它太简单了。它停止寻找开始条件,直到满足结束条件。此外,您每行运行一次该代码,因此当您到达第二行时,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/'

推荐阅读