2015-01-11 83 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   * 
}