在匹配的行后打印第n行

时间:2018-06-13 18:20:47

标签: perl

我有一个包含以下内容的输入文件

SCHEDULE "TEST"
 DESCRIPTION "Do Some stuff"
    MINUTE   "53"
    HOUR     "21"

SCHEDULE "DUMMY CHECK"
  DESCRIPTION "Do some stuff"

  Check something
    INTERVAL "10m"
    MINUTE   "50"
    HOUR     "21"

我需要在匹配线SCHEDULE“DUMMY CHECK”之后匹配第3行,这是INTERVAL“10m”。 (修改并从中获取10m 。)我已为此目的编写了以下代码,但我不确定这是否确切这样做的方式,或者我们有任何简单的其他逻辑。

use strict;
use warnings;

my $file = "input.txt";
my @data;
open (IN,"<","$file");
my $count = 0;
 while (<IN>) {
  $count = 1 if /SCHEDULE\s"(DUMMY\sCHECK)".*/;
    if ($count >= 1 and $count <= 6) {
    @data = $_;
    print @data;
    $count++;  
    }

 }

2 个答案:

答案 0 :(得分:2)

评论中

更新:如果INTERVAL行之后的第4行<{1}},请在DUMMY行获取数据

use strict;
use warnings;
use feature 'say';

my $file = shift @ARGV  or usage();

open my $fh_in, '<', $file or die "Can't open $file: $!";

my $offset = 4;

my $anchor;
while (<$fh_in>) { 
    $anchor = $.  if /SCHEDULE\s"DUMMY\sCHECK"/;
    if ($anchor and $. == $anchor+$offset and /^\s*INTERVAL\s*"(.*?)"/) {
        #print;                 # the whole line
        say "interval is: $1";  # captured data on the line
    }
}

sub usage {
    say STDERR "Usage: $0 filename";
    exit;
}

$. variable具有上次访问的文件句柄中的当前行号。

答案 1 :(得分:0)

我会使用flip-flop运算符。这使您只能在SCHEDULE“DUMMY CHECK”部分进行操作。从那里开始,你所在的线路并不重要,你可以捕获INTERVAL字段。

use v5.10;

open (IN,"<","$ARGV[0]");

while (<IN>) {
    if (/^SCHEDULE "DUMMY CHECK"/ .. eof) {
        say "interval: $1" if /INTERVAL (.*)/
    }
}

请注意,我使用eof作为触发器终结器。如果数据文件还有更多,你可以“翻转”另一个正则表达式(可能是/^SCHEDULE/)。