Perl regex cisco файл конфигурации печать нескольких строк - PullRequest
1 голос
/ 03 февраля 2011

Я ищу регулярное выражение perl, которое соответствует "vserver foo2" из приведенного ниже вывода Тем не менее, я хочу вернуть строку матча, а все последующие строки до "!" Я только хочу напечатать конфиг для "vserver foo2"
Спасибо за помощь!

Конфигурация Cisco:
!
всервер foo1
описание foo
виртуальный 1.1.1.1 tcp www
serverfarm foofoo
постоянный перебаланс
ИНСЕРВИС
!
всервер foo2
описание foo2
виртуальный 1.1.1.2 tcp www
serverfarm foofoo2
постоянный перебаланс
ИНСЕРВИС
!
всервер foo3
описание foo3
виртуальный 1.1.1.3
serverfarm foo3
дублировать соединение csrp
постоянный перебаланс
ИНСЕРВИС
!

Ответы [ 4 ]

7 голосов
/ 03 февраля 2011
perl -ne 'print if /^vserver foo2/ .. /^!/' config.txt
1 голос
/ 03 февраля 2011

Предполагая, что $ content содержит весь файл, вы должны сделать что-то вроде:

my ($config) = $content =~ m/\n!\n(vserver foo2[^!]*)/sm;

при условии, что у вас нет '!' где-то в вашей конфигурации.

Но я думаю, что лучший способ сделать это - запустить цикл и пропустить регулярное выражение: при условии, что $ fh является дескриптором файла:

my $line;
# cut the leading lines
do {
  $line = <$fh>;
  chomp $line;
while ($line ne "!");

while ($line = <$fh>) {
   chomp $line;
   my $found = ($line eq "vserver foo2");
   while ($line = <$fh>) {
      chomp $line;
      break if $line eq "!";
      say $line if $found; 
   }
   break if $found;
}
1 голос
/ 03 февраля 2011
open IN, '<', '1.txt';
while(<IN>) {
    if (/^vserver foo2$/) { $found = 1 }
    last if (/^!$/ and $found);
    print if $found
}
0 голосов
/ 03 февраля 2011

Регулярное выражение для соответствия строке vserver foo2 легко: /vserver foo2/.

Возможно, самый простой способ получить несколько строк для этой проблемы - переопределить input record separatorпеременная $/ при загрузке этого файла, так что каждая запись (все, что находится между "!") хранится в одном скаляре.Например,

local $/ = "!\n";
open my $fh, '<', $cisco_config_file;
my @configurations = <$fh>;

Теперь каждый элемент @configurations содержит целую запись.Чтобы получить соответствующие записи, теперь просто скажите

my @matching_records = grep { /vserver foo2/ } @configurations;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...