TCL의 여러 중첩 괄호에서 데이터 추출

TCL의 여러 중첩 괄호에서 데이터 추출

또 다른 도움이 필요합니다. 이 내용은 계속됩니다.Bash의 중첩된 괄호에서 데이터 추출,

여러 블록이 포함된 아래와 같은 입력 데이터가 있습니다. 네트워크 VLAN 블록만 확인하고 인증, 네트워크 트렁크, 네트워크 인터페이스 블록을 제외하는 논리를 추가하고 싶습니다.

auths remote {
    roles {
        admin {
            role administrator
        }
        readonly {
            role read-only
        }
    }
}

auths ldap system { 
    login-attribute uid
    port 636
}

network vlan internal-vlan {
    description "internal-use"
    interfaces {
        1.1 { }
        1.2 { }
    }
    MTU {
    1500
    }
}
network vlan external-vlan {
    description "external-use"
    interfaces {
       2.1 { }
       2.2 { }
    }
    MTU {
    1500
    }
}
network vlan dummy-vlan {
    description "dummy-use"
    interfaces {
       1.1 { }
    }
}

network trunk {
    description "none"
}

network interface 1.1 {
    Status {
        UP
    }
}
network interface 1.2 {
    Status {
        UP
    }
}
network interface 2.1 {
    Status {
        DOWN
    }
}
network interface 2.2 {
    Status {
        UP
    }
}
system update settings {
    frequency monthly
}

이전과 비슷한 출력을 원합니다. 블록이 "network vlan"으로 시작하는지 확인한 다음 proc 네트워크를 트리거하려면 부모 기능을 만들고 if 논리를 넣어야 한다고 생각합니다.

문자열 "network vlan"을 확인한 다음 proc을 트리거하는 if 논리를 넣을 수 있다면 나머지 구성과 관련이 있고 필요할 때마다 새 기능을 만들 수 있다고 생각합니다.

답변1

귀하의 마지막 질문에서 Perl 솔루션을 요청했으므로 여기에 중첩된 블록을 일치시키는 데 필요한 재귀 정규식을 제외하고는 상당히 간단한 솔루션이 있습니다 . {...}이를 변수로 분리했습니다 $balanced. 또한 각 키워드 뒤 의 블록을 일치시키기 위해 한 번씩 3번 사용할 수 있습니다 network vlan.interfacesMTU

#!/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 전문가가 아니기 때문에 의심할 여지 없이 이것에 대한 더 최적의 버전이 있습니다.

관련 정보