Notepad++ Suchen und Ersetzen von Platzhaltern

Notepad++ Suchen und Ersetzen von Platzhaltern

Ich habe viel darüber gelesen, wie ich es durch Notepad++ ersetzen kann, aber ich komme einfach nicht weiter.

Hier ist ein Beispiel für eine Juniper-Konfiguration, die ich in eine andere Sprache ändern werde:

set policy id 3016 from "CSA" to "Untrust"  "1.1.1.1/32" "2.2.2.2/32" "SSH" permit log 
set policy id 3016
set dst-address "3.3.3.3/32"
exit
!    
set policy id 3053 name "Footprints" from "Untrust" to "CSA"  "Blocked Addresses" "Any" "ANY" deny log 
set policy id 3053
exit

Jetzt möchte ich dies in Fortinet Language ändern, aber um diesen Prozess zu starten, muss es nach bestimmten Variablen suchen. Die wenigen Dinge, die ich ändern muss, sind:

set policy id 3016 from "CSA" to "Untrust"  "1.1.1.1/32" "2.2.2.2/32" "SSH" permit log 
set policy id 3016
set dst-address "3.3.3.3/32"
exit
!    
set policy id 3053 name "Footprints" from "Untrust" to "CSA"  "Blocked Addresses" "Any" "ANY" deny log 
set policy id 3053
exit

Zu

edit 0
    set srcintf "CSA"
    set dstintf "Untrust"
    set srcaddr "1.1.1.1/32"
    set dstaddr "2.2.2.2/32" "3.3.3.3/32"
    set action accept
    set schedule "always"
    set service "SSH"
    set fsso disable
    set nat enable
next
edit 0
    set name "Footprints"
    set srcintf "Untrust"
    set dstintf "CSA"
    set srcaddr "Blocked Addresses"
    set dstaddr "all"
    set action accept
    set schedule "always"
    set service "ALL"
    set fsso disable
    set nat enable
next

also habe ich zunächst Folgendes versucht, um loszulegen:

Suchen (set policy id (.+))und Ersetzen durch edit 0– Dadurch wird scheinbar alles hervorgehoben und ich habe eine leere Konfiguration, in der nur noch 0 bearbeitet werden kann.

Dann habe ich versucht, mit „Suchen (set policy id *)und Ersetzen durch edit 0“ zu arbeiten. Dadurch bleibt alles übrig, aber es sieht nun wie folgt aus: (Im Grunde wird vor XXXX eine 0 eingefügt.

edit 03016 from "CSA" to "Untrust" "1.1.1.1/32" "2.2.2.2/32" "SSH" permit log set policy id 3016 set dst-address "3.3.3.3/32" exit

Ich wäre für jede Hilfe sehr dankbar, da sie mir Stunden ersparen könnte!!!!

Antwort1

Meiner Meinung nach sollten Sie ein Skript in Ihrer bevorzugten Skriptsprache schreiben.

Wenn Sie diese Aufgabe jedoch wirklich mit Ntepad++ erledigen möchten, gibt es hier eine Regex-Lösung. Wie Sie sehen, sind der Regex und der Ersatz etwas komplex und erfordern gute Kenntnisse, um sie beizubehalten.

  • Ctrl+H

  • Finde was:set policy id \d+ (?:(?:(?!exit).)*?name (".+?"))?(?:(?!exit).)*?from (".+?")(?:(?!exit).)*?to (".+?")(?:(?!exit).)*?("\d{1,3}(?:\.\d{1,3}){3}/\d+"|"[\w ]+") ("\d{1,3}(?:\.\d{1,3}){3}/\d+"|"[\w ]+") (".+?")(?:(?:(?!exit).)*?set dst-address (".+?"))?(?:(?!exit).)+?exit

  • Ersetzen mit:edit 0\n\t(?1set name $1\n\t:)set srcintf $2\n\tset dstintf $3\n\tset srcaddr $4\n\tset dstaddr $5(?7 $7:)\n\tset action accept\n\tset schedule "always"\n\tset service $6\n\tset fsso disable\n\tset nat enable\nnext

  • ÜBERPRÜFEN Groß-/Kleinschreibung beachten

  • ÜBERPRÜFEN Umwickeln

  • ÜBERPRÜFEN Regulären Ausdruck

  • ÜBERPRÜFEN . matches newline

  • Replace all

  • Find All in Current Document

Erläuterung:

set policy id \d+                           # literally and digits for id
(?:                                         # non capture group
    (?:(?!exit).)*?                         # 0 or more any character but not the word "exit"
    name (".+?")                            # name is captured in group 1
)?                                          # end group, optional
(?:(?!exit).)*?                             # 0 or more any character but not the word "exit"
from (".+?")                                # from is captured in group 2
(?:(?!exit).)*?                             # 0 or more any character but not the word "exit"
to (".+?")                                  # to is captured in group 3
(?:(?!exit).)*?                             # 0 or more any character but not the word "exit"
("\d{1,3}(?:\.\d{1,3}){3}/\d+"|"[\w ]+")    # group 4, src IP or literal like "Blocked Addresses"
("\d{1,3}(?:\.\d{1,3}){3}/\d+"|"[\w ]+")    # group 5, dst IP or literal like "Any"
(".+?")                                     # group 6, service
(?:                                         # non capture group
    (?:(?!exit).)*?                         # 0 or more any character but not the word "exit"
    set dst-address                         # literally
    (".+?")                                 # group 7, 1 or more any character, not greedy
)?                                          # end group, optional
(?:(?!exit).)*?                             # 0 or more any character but not the word "exit"
exit                                        # literally

Ersatz:

edit 0\n\t                      # edit 0 followed by linefeed and tabulation
(?1                             # if group 1 exists, (name)
    set name $1\n\t               # print the name (group 1)
    :                           # else
                                  # nothing
)                               # end if
set srcintf $2\n\t              # and so on ...
set dstintf $3\n\t
set srcaddr $4\n\t
set dstaddr $5
(?7 $7:)\n\t
set action accept\n\t
set schedule "always"\n\t
set service $6\n\t
set fsso disable\n\t
set nat enable\n
next

Bildschirmaufnahme (vorher):

Bildbeschreibung hier eingeben

Bildschirmaufnahme (nachher):

Bildbeschreibung hier eingeben

Hier finden Sie eine vollständige ErklärungHier

verwandte Informationen