別の助けが必要です。続行する必要があります。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
}
前と同様の出力が欲しい親関数を作成し、ifロジックを入れてブロックが "network vlan"で始まることを確認してから、procネットワークをトリガーする必要があると思います。
文字列 "network vlan"を確認してからプロセスをトリガーするifロジックを配置できる場合は、残りの構成を相互に関連付けて必要な場所に新しい機能を作成できるようです。
ベストアンサー1
以前の質問でPerlソリューションを要求したので、ここで{...}
変数で区切ったネストしたブロックと一致するために必要な再帰正規表現を除いて、かなり単純なソリューションがあります$balanced
。これにより、各キーワードnetwork vlan
とinterfaces
次のブロックを一致させるために一度に合計3回使用できます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
ブロックの先頭を一致させるには、を使用し、or以外の{
項目を一致させ続けます{
。オプションで、2つの括弧を返す再帰が続きます。これはオプションで内部にあります。私はPerlの専門家ではないので、間違いなくより最適化されたバージョンがあります。}
[^{}]*
{
}
{(?-2)*}
()?