2016-06-27 2 views
1

Может ли кто-нибудь дать объединенное регулярное выражение для ниже входных данных?Одно консолидированное регулярное выражение для нижеприведенных значений

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*)))/ 

Выход я требую, что с каждого входа я получаю значение как:

    • 1-я группа: eth1/10.404
    • 2-я группа: p2p
    • первая группа: ae0.100
    • вторая группа: p2p
    • первая группа: pool0
    • вторая группа: multibind lastresort
    • 1-я группа : Loop0
    • вторая группа: петлевой
    • первая группа: ae0.100
    • первая группа: loop0

выше регулярное выражение не работает на 3 входа.

+0

ли ваш вход пронумеровали данные, или вы просто пронумерованы примеры? – Sobrique

ответ

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"; 
} 
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 
} 
1

Не Regex, используйте 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 

Использует //, который является 'определенно' условно, чтобы возвращать либо значение или строку '(отсутствует).

выход:

eth1/10.404 => p2p 
ae0.100 => p2p 
pool0 => multibind lastresort 
loop0 => loopback 
ae0.100 => (none) 
loop0 => (none) 
0

Это, кажется, работает для меня:

interface(\s[\w\d\/.]+)(.*)?

Demo here

Смежные вопросы