2015-01-11 81 views
0

我是Perl的初學者,並且試圖在搜索關鍵詞後在兩個關鍵詞之間打印段落。在Perl中的兩個關鍵詞之間提取段落

所以這應該尋找ooaijp01.intlb.net-pool,如果它匹配它應該打印一個關鍵的詞

下面是輸入文件之間的段落。你能幫我實現嗎? 它應該忽略大小寫

和文件名

pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    alternatkke  ** 
    fallback  ***** 
    fallback_ipv4 **** 
    partition "Common" 

    member   ***** 
    member   ******* 
} 

pool 


pool { 
    name   "ooaijj01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    alternatkke  ** 
    fallback  ***** 
    fallback_ipv4 **** 
    partition "Common" 

    member   ***** 
    member   ******* 
} 

pool 


pool { 
    name   "ooaijk01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    alternatkke  ** 
    fallback  ***** 
    fallback_ipv4 **** 
    partition "Common" 

    member   ***** 
    member   ******* 
} 

pool 

我曾嘗試與此代碼,但它不工作會gslb_data。

#!/usr/bin/perl 

open my $fh, '<', 'file_to_check' 
    or die "Cannot open: $!"; # file_to_check is my file name 
my @file = <$fh>; 
close $fh; 

for (0 .. $#file) { 

    if ($file[$_] =~ /"ooaijp01.intlb.net-pool"/) { # is my key word ooaijp01.intlb.net-pool 

    my $start = $_; 

    while ($start >= 0 && $file[$start] !~ /pool/) { 
     $start--; 
    } 

    my $end = $_; 

    while ($end <= $#file && $file[$end] !~ /pool/) { 
     $end++; 
    } 

    print "\[email protected][$start+1..$end-1]"; 
    } 
} 

我的預期輸出應該是

pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    alternatkke  ** 
    fallback  ***** 
    fallback_ipv4 **** 
    partition "Common" 

    member   ***** 
    member   ******* 
} 

pool 

,我想在一個單獨的輸出文件保存

+0

您可以將整個文檔寫入一個變量,然後嘗試獲取模式之間的值。這應該對你有幫助 – Praveen

回答

0

已經沒有人提到「範圍內操作'呢?

事情是這樣的:

print "pool {\n"; 
while (<DATA>) { 
    print if /ooaijp01.intlb.net-pool/ .. /\}/; 
} 

將打印的開始和結束模式之間的任何線路。

+0

它適用於我..非常感謝.. – clement

0

@clement:你可以試試下面的Perl代碼:

沒有咕嘟咕嘟:

use strict; 
use warnings; 

my $filename = $ARGV[0]; 
my ($file,$ext)=$filename =~ /(.*?)(\..*?)/; 
my $outfile = "$file" . "\.out"; 
open my $fh,'<',$filename or die "File $filename cannot be opened: $!"; 
open my $oh,'>',$outfile or die "File $outfile cannot be opened : $!"; 
my $start=0; 
while(<$fh>) 
{ 
    if($_ =~ /ooaijp01\.intlb\.net\-pool/is) 
     { 
     $start = $.; 
    print $_ . "\n"; 
     } 

    elsif($start>0 && $_ !~ /pool/) 
     { 
      print $_ . "\n"; 
     } 

} 

使用咕嘟咕嘟:

use strict; 
use warnings; 

my $filename = $ARGV[0]; 
my ($file,$ext)=$filename =~ /(.*?)(\..*?)/; 
my $outfile = "$file" . "\.out"; 
open my $fh,'<',$filename or die "File $filename cannot be opened: $!"; 
open my $oh,'>',$outfile or die "File $outfile cannot be opened : $!"; 

my $document = do { 
     local $/ = undef; 
     open my $fh,'<',$filename or die "Couldn't open the file $filename:$!"; 
     <$fh>; 
     }; 


sub Processing 
{ 
    my $result = $_[0]; 
    if($result =~ /ooaijp01\.intlb\.net\-pool/isg) 
     { 
      print $oh $result . "\n"; 
     } 
    }   

$document =~ s/(pool\s*\{.*?\s*\}\s*pool)/Processing($1)/eisg; #Between the keywords pool 
+0

問題不明確,根據他的代碼,我已經修改。我能否知道爲什麼我的答案是否定的? – Praveen

+0

感謝Praveen ,,,它不適合我..任何其他建議.. – clement

+0

編輯問題併發布您輸入的期望輸出。 – Praveen

0

下面是一個方法來完成這項工作:

#!/usr/bin/perl 
use Modern::Perl; 

my $toprint; 
my @out; 
while(<DATA>) { 
    chomp; 
    if (/^\s*pool\b/) { # ^\s* is mandatory to not catch net-pool 
     if ($toprint) { 
     say $_ for @out; 
     } 
     $toprint = 0; 
     @out = ($_); 
    } elsif ($_ =~ /\booaijp01\.intlb\.net-pool\b/) { 
     $toprint = 1; 
     push @out, $_; 
    } else { 
     push @out, $_; 
    } 
} 

if ($toprint) { 
    say $_ for @out; 
} 

__DATA__ 
pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    member   ******* 
} 

pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    member   ******* 
} 

pool { 
    name   "ooaijp01.xxxx" 
    ttl   * 
    preferred  *** 
    member   ******* 
} 

pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  * 
    member   * 
} 

輸出:

pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    member   ******* 
} 

pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  *** 
    member   ******* 
} 

pool { 
    name   "ooaijp01.intlb.net-pool" 
    ttl   * 
    preferred  * 
    member   * 
}