perl - 在 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]";
}
有人可以帮我在一个循环中做同样的事情吗?
解决方案
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