在Perl中提取两个关键词之间的段落
Extracting a paragraph between two key words in Perl
我是 Perl 的初学者,正在尝试在搜索关键字后在两个关键字之间打印一段。
所以这应该搜索 ooaijp01.intlb.net-pool
,如果匹配,它应该在关键字
之间打印一个段落
下面是输入文件。你能帮我实现这个目标吗?
它应该忽略区分大小写
文件名将是 gslb_data
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
我已经尝试使用此代码,但它不起作用。
#!/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 "\n@file[$start+1..$end-1]";
}
}
我的预期输出应该是
pool {
name "ooaijp01.intlb.net-pool"
ttl *
preferred ***
alternatkke **
fallback *****
fallback_ipv4 ****
partition "Common"
member *****
member *******
}
pool
我想保存在一个单独的输出文件中
@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";
}
}
使用 Slurping :
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()/eisg; #Between the keywords pool
这是完成这项工作的一种方法:
#!/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 *
}
还没有人提到 'range operator' 吗?
像这样:
print "pool {\n";
while ( <DATA> ) {
print if /ooaijp01.intlb.net-pool/ .. /\}/;
}
将打印开始和结束模式之间的任何行。
我是 Perl 的初学者,正在尝试在搜索关键字后在两个关键字之间打印一段。
所以这应该搜索 ooaijp01.intlb.net-pool
,如果匹配,它应该在关键字
下面是输入文件。你能帮我实现这个目标吗? 它应该忽略区分大小写
文件名将是 gslb_data
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
我已经尝试使用此代码,但它不起作用。
#!/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 "\n@file[$start+1..$end-1]";
}
}
我的预期输出应该是
pool {
name "ooaijp01.intlb.net-pool"
ttl *
preferred ***
alternatkke **
fallback *****
fallback_ipv4 ****
partition "Common"
member *****
member *******
}
pool
我想保存在一个单独的输出文件中
@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";
}
}
使用 Slurping :
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()/eisg; #Between the keywords pool
这是完成这项工作的一种方法:
#!/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 *
}
还没有人提到 'range operator' 吗?
像这样:
print "pool {\n";
while ( <DATA> ) {
print if /ooaijp01.intlb.net-pool/ .. /\}/;
}
将打印开始和结束模式之间的任何行。