Perl:匹配一个模式,然后打印N行K次

时间:2015-07-11 13:10:59

标签: regex perl

我有一个像这样的文本文件

count="4"
data1
data2
data3
Data1
Data2
Data3

我需要搜索字符串count并获取其值(4)并打印接下来的3行计数(4)次。

文件中的输出应为

data1
data2
data3
data1
data2
data3
data1
data2
data3
data1
data2
data3
Data1
Data2
Data3

我试过这个Perl代码

while ( <FILE> ) {
    $n = 3
    if ( $_ =~ /count="4"/ ) {
        print FILE if ($n-- > 0) x 4;
    }

但它没有用。

4 个答案:

答案 0 :(得分:4)

  

但它不起作用。

这是因为

if ($n-- > 0) x 4

没有做你想要的。 x重复一个值(即您正在执行if 1111),它不会重做语句。

尝试:

use strict; use warnings;
while (<FILE>) {
  if ( /count="(\d+)"/ ) {
    for ( 1..$1 ) {
      if ( defined ( my $l = <FILE> ) ) {
        print $l;
      }
    }
  }
}

那会让你开始。

将来请注意:

答案 1 :(得分:1)

您可以尝试这样的事情:

select *

答案 2 :(得分:0)

您可以在@data

提供文件/输入
#!/usr/bin/perl 
use strict;
use warnings;
my @data = qw /count="4" data1-1 data2-1 data3-1 Data1 Data2 Data3/;
my $repeat_line = 3;
foreach (@data)
{
  if ( /count="(\d+)"/ ) {
    for ( 1..$1 ) {
      for my $no1 ( 1..$repeat_line ) {
    print $data[$no1],"\n";
      }
    }
  }
}
for my $no ($repeat_line..scalar(@data)) {
  if(defined $data[$no+1]){
    print $data[$no+1],"\n";
  }
}

输出

data1-1
data2-1
data3-1
data1-1
data2-1
data3-1
data1-1
data2-1
data3-1
data1-1
data2-1
data3-1
Data1
Data2
Data3

答案 3 :(得分:0)

你可以使用这个单行:

perl -ne 'print m/count="(\d+)"/?$n=(<>.<>.<>)x$1:$_' file
#         ^     ^                ^            ^  ^^---- the current line.
#         |     |                |            |  '---- else
#         |     |                |            '---- repeated $1 times
#         |     |                '---- the three next lines (if any) stored in $n
#         |     '---- when this pattern succeeds,
#         '---- Print,