2011-02-03 16 views
1

私は以下の出力から "vserver foo2"と一致するperl正規表現を探しています。しかし、私は試合のラインを戻したいと思うし、次のすべてのラインを "!"私は "vserver foo2"の設定を印刷したいだけです
Thx!perl regex cisco設定ファイル複数の行を印刷

シスコの設定:


説明fooの
foo1のvserverの仮想1.1.1.1 TCP WWW
サーバファームfoofoo
永続的なリバランス
現職


foo2はvserverの説明foo2は
仮想1.1.1.2 TCP WWW
サーバファームfoofoo2
永続的なリバランス
現職


foo3のvserver説明foo3
仮想1.1.1.3
サーバファームfoo3
複製csrp接続
永続的なリバランス
現職

答えて

7
perl -ne 'print if /^vserver foo2/ .. /^!/' config.txt 
+1

なぜ私はperlが大好きです。それはちょうどあなたが意味するものを得る:) –

0

vserver foo2という文字列に一致する正規表現は、簡単です。/vserver foo2/です。

おそらく、このファイルを読み込むときに変数を上書きして、すべてのレコード( "!"の間のすべてのもの)が単一のスカラーに保持されるようにするのが最も簡単な方法です。例えば、

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

は今@configurationsの各要素は、レコード全体が含まれています。ドンあなたと仮定して

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

:今、あなただけの、あなたのような何かを行う必要があり、その$コンテンツがすべてのファイルを持っていると仮定すると、

my @matching_records = grep { /vserver foo2/ } @configurations; 
+0

は迅速な対応ありがとうございました素晴らしい提案です。 – dars33

1
open IN, '<', '1.txt'; 
while(<IN>) { 
    if (/^vserver foo2$/) { $found = 1 } 
    last if (/^!$/ and $found); 
    print if $found 
} 
1

言って、一致するレコードを取得するには「持っている!」あなたの設定のどこかに。

しかし、それを行うには良い方法は、私が思うに、ループを実行すること、および正規表現をスキップします: $の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; 
} 
関連する問題