
もう一つ助けが必要です。これは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
}
以前と同様の出力が必要です。親関数を作成し、ブロックが「ネットワーク VLAN」で始まるかどうかをチェックする if ロジックを配置して、proc ネットワークをトリガーする必要があると思います。
文字列「ネットワーク VLAN」をチェックする if ロジックを配置して、プロシージャをトリガーできる場合は、残りの構成に関連付けて、必要な場所に新しい関数を作成できると思います。
答え1
前回の質問では Perl のソリューションを尋ねられたので、ここではネストされた{...}
ブロックに一致させるために必要な再帰正規表現を除いて、かなり単純なソリューションを示します。この再帰正規表現は、変数 に分離しました。これにより、キーワード、、$balanced
の後のブロックに 1 回ずつ一致させて、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 つの括弧に戻る再帰である と がオプションで続き、つまり になります。これは、オプションにするために の中にあります。私は Perl の専門家ではないので、間違いなくこれのより最適なバージョンがあります。}
[^{}]*
{
}
{(?-2)*}
()?