Ich spiele mit einer Cisco-Konfigurationsdatei und versuche, verschiedene Dinge zu ersetzen. Die Art und Weise, wie ich damit umgegangen bin, ist im folgenden Ausschnitt dargestellt. Dies funktioniert gut für einzeilige Ersetzungen, aber ich kann keinen guten Weg finden, mehrere Zeilen im selben Block zu ersetzen.

(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;

Dies funktioniert für die Dinge, die ich bisher ersetzt habe (snmp-Communities und so weiter). Ich versuche nicht, die Zertifikate zu entfernen.

Für das folgende Beispiel funktioniert es nicht, wahrscheinlich weil es mehrzeilig ist?

 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
!  

Der Regex, mit dem ich gespielt habe, ist:

if ($line =~ /certificate self.*/) { $line =~ s/(certificate self.*(.+?).*quit)/$2 <withheld-info>/gis;}

Irgendwelche Vorschläge, wie das funktionieren kann?

0
Andy Thompson 17 Aug. 2020 im 10:43

2 Antworten

Beste Antwort

Sie können while(<FD>) Schleifen verschachteln. In der äußeren Schleife suchen Sie nach der Startsequenz und in der inneren Schleife suchen Sie nach der Endsequenz.

#! /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
1
ceving 17 Aug. 2020 im 08:08

Die Frage ist nicht sehr gut artikuliert, es wird keine gewünschte Ausgabe bereitgestellt

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;

Eingabedatendatei

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

Ausgabe

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
0
Polar Bear 18 Aug. 2020 im 05:18