如何解决删除图案之间的多条线
我正在玩一个Cisco配置文件,试图替代一些东西。我一直在处理它的方式如下面的代码片段所示。这对于单行替换效果很好,但是我找不到在同一块中替换多行的好方法。
(open FILE,$config) || die "Could not open ".$config."\n";
while(<FILE>)
{
my $line = $_;
chomp($line);
if $line =~ (/<someregex>/) {$line =~ s/(<someregex)/;}
..
$conf .= " $line\n";
}
close FILE;
这适用于到目前为止我替换的东西(snmp communitites之类的东西)。我正在尝试删除证书。
对于下面的示例,它不起作用,可能是因为它是多行的?
certificate self-signed 01
AB238019 01293012 41312309 AF393100 300D484H D32309HF GE349013 50023020
A6900000 01000000 617FF57F 7A4DB56E 81890281 80301D06 4EF6C8D3 AE00DEDE
.. etc (total 18 lines)
quit
!
我一直在玩的正则表达式是:
if ($line =~ /certificate self.*/) { $line =~ s/(certificate self.*(.+?).*quit)/$2 <withheld-info>/gis;}
关于它如何工作的任何建议?
解决方法
您可以嵌套while(<FD>)
个循环。在外循环中,您搜索开始序列,在内循环中,您搜索结束序列。
#! /usr/bin/perl
use strict;
use warnings;
LINE: while(<DATA>)
{
my $line = $_;
chomp($line);
if ($line =~ /^ certificate self-signed 01$/)
{
while (<DATA>)
{
next LINE if /^!$/;
}
}
print $line,"\n";
}
__DATA__
a
certificate self-signed 01
AB238019 01293012 41312309 AF393100 300D484H D32309HF GE349013 50023020
A6900000 01000000 617FF57F 7A4DB56E 81890281 80301D06 4EF6C8D3 AE00DEDE
.. etc (total 18 lines)
quit
!
b
,
问题表达得不太清楚,没有提供所需的输出结果
use strict;
use warnings;
use feature 'say';
my $config = shift or die 'Profile filename';
open my $fh,'<',$config
or die "Couldn't open $config";
my $data = do{ local $/; <$fh> };
close $fh;
$data =~ s/(certificate self-(.+?)quit)/$2 <withheld-info>/gis;
say $data;
输入数据文件
data #1
data #2
data #3
certificate self-signed 01
AB238019 01293012 41312309 AF393100 300D484H D32309HF GE349013 50023020
A6900000 01000000 617FF57F 7A4DB56E 81890281 80301D06 4EF6C8D3 AE00DEDE
.. etc (total 18 lines)
quit
!
data #4
data #5
data #6
输出
data #1
data #2
data #3
signed 01
AB238019 01293012 41312309 AF393100 300D484H D32309HF GE349013 50023020
A6900000 01000000 617FF57F 7A4DB56E 81890281 80301D06 4EF6C8D3 AE00DEDE
.. etc (total 18 lines)
<withheld-info>
!
data #4
data #5
data #6
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。