首页 > 解决方案 > 在 perl 之后找到匹配并复制行

问题描述

我有以下数据..

interface 123
 item1
 item2
 item3
interface 456
 item5
 item6
 item7
card 477
 something foo
 somethig bar

每个界面都从行的最开头开始,每个界面的细节在实际项目之前都有一个空格。这是唯一可以区分的配置细节何时结束。

我需要搜索每个界面,并将其复制,直到下一行不以空格开头。

所以我需要将每个界面与其内容细节分开,而不是卡片。我在上一个问题中得到了帮助,但是 2 个循环让我失望了,我只想运行 1 个循环,因为我稍后会做更多的事情,比如重复数据删除,所以 2 个循环让我非常困惑。

my @idx = grep { $lines[$_] =~ /^interface/ } 0..$#lines;

for my $i (0..$#idx-1) {
say "Interface:";
say "\t$_" for @lines[$idx[$i]..$idx[$i+1]-1];
}

# The last interface section stops at the first unindented line
say "Interface:";
for my $i ($idx[-1] .. $#lines) {
    last if $lines[$i] =~ /^\S/ and $lines[$i] !~ /^interface/;
    say "\t$lines[$i]";
}

有人可以帮我在一个循环中做同样的事情吗?

标签: perl

解决方案


use strict; use warnings;

my $interface_line;
while(<DATA>) {
  if( /^interface/ ) { # start of new interface-section
    $interface_line = 1;
  }elsif( $interface_line && /^[ \t]/ ) { # interface-section followup
    $interface_line++;
  }elsif( $interface_line ) { # end of interface-section 
    $interface_line = undef;
  }

  if( $interface_line ) {
     print "Interface:\n" if $interface_line == 1;
     print "$interface_line: $_";
  }
}

__DATA__
interface 123
 item1
 item2
 item3
interface 456
 item5
 item6
 item7
card 477
 something foo
 somethig bar

推荐阅读