有人可以为下面的输入提供合并的正则表达式吗?
1. interface eth1/10.404 p2p
2. interface ae0.100 p2p
3. interface pool0 multibind lastresort
4. interface loop0 loopback
5. interface ae0.100
6. interface loop0
我创建了一个,但它没有给我所需的输出:
/^\sinterface\s(((\w*\/*\w*.\w*)\s(\w*.*))|((\w*\/*\w*.\w*)))/
我需要的输出是从每个输入我收到的值为:
以上正则表达式不适用于3个输入。
答案 0 :(得分:2)
请勿正则表达式,请使用split
:
#!/usr/bin/perl
use strict;
use warnings;
while ( <DATA> ) {
chomp;
next unless /interface/;
my ( undef, undef, $if_name, $options ) = split / /, $_, 4;
print "$if_name => ",$options // '(none)',"\n";
}
__DATA__
1. interface eth1/10.404 p2p
2. interface ae0.100 p2p
3. interface pool0 multibind lastresort
4. interface loop0 loopback
5. interface ae0.100
6. interface loop0
使用//
这是'已定义'条件,返回值或字符串'(none)'。
输出:
eth1/10.404 => p2p
ae0.100 => p2p
pool0 => multibind lastresort
loop0 => loopback
ae0.100 => (none)
loop0 => (none)
答案 1 :(得分:0)
试试这个:
#!/usr/bin/perl
while(<>) {
next unless m{interface\s+(\S+)(\s+(.+))?\s*$};
print "1st group:-$1";
print " 2nd group:-$3" if $3 ne '';
print "\n";
}
答案 2 :(得分:0)
您有简单的空格分隔数据。看起来这可能是一个更容易的解决方案:
if ($line =~ /^interfaces/) {
chomp($line);
my @fields = split(/ /, $line, 3);
# Use $fields[1], and use $fields[2] if it is defined.
# Check with e.g., scalar(@fields) == 3
}
答案 3 :(得分:0)
答案 4 :(得分:0)