Извлечение данных из нескольких вложенных скобок в TCL

Как и в других ответах, опубликованных ранее,можно перевести запущенный процесс в использование screenзадним числом благодаря reptyr , а затем закрыть терминал. Шаги описаны в этом посте . Шаги, которые нужно предпринять:

  1. Приостановить процесс
  2. Возобновление процесса в фоновом режиме с помощьюbg
  3. disownпроцесс
  4. Запустить screenсеанс
  5. Найти PID процесса
  6. Используйте reptyr, чтобы взять на себя управление процессом

0
16.04.2020, 16:31
1 ответ

Поскольку ваш последний вопрос задавался о Perl-решениях, вот одно довольно простое, за исключением рекурсивного регулярного выражения, необходимого для сопоставления вложенных {...}блоков, которые я выделил в переменную $balanced. Это также позволяет использовать его 3 раза, по одному разу для соответствия блоку после каждого из ключевых слов network vlan, interfacesи MTU.

#!/usr/bin/perl
use strict;
open(F,"datafile") or die;
my $data = join("",<F>);
my $balanced = qr/
 (    ( [^{}]*+
        ({     (?-2)*   })?
      )*
 )/x;
while($data =~ m/network\s+vlan\s+([^ {]+)\s*{$balanced}/g){
    my $vlan = $1;
    my $body = $2;
    $body =~ m/description\s*("[^\"]*")/;
    my $desc = $1;
    $body =~ m/interfaces\s*{$balanced}/;
    my $intf = $1;
    $intf =~ s/\s+/ /g;
    my $mtu = 'none';
    $mtu = $1  if($body =~ m/MTU\s*{$balanced}/);
    $mtu =~ s/\s+/ /g;
    print "$vlan, $desc,$intf,$mtu\n";
}

$balancedиспользуется после того, как вы сопоставили открытие {блока, и продолжает сопоставлять все, что не является {или }, используя [^{}]*.За ним необязательно следует {, рекурсия, идущая назад на 2 скобки, и }, а именно {(?-2)*}. Это внутри ()?, чтобы сделать его необязательным. Я не специалист по Perl, поэтому, несомненно, есть более оптимальная версия этого.

1
19.03.2021, 02:28

Теги

Похожие вопросы