Notepad++ Найти и заменить WildCard

Notepad++ Найти и заменить WildCard

Я много читал о том, как заменить его с помощью Notepad++, но, похоже, так и не пришел ни к чему.

Вот пример конфигурации Juniper, которую я изменю на другой язык:

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

Теперь я хочу изменить это на Fortinet Language, но для того, чтобы начать этот процесс, мне нужно, чтобы он искал определенные переменные. Несколько битов, которые мне нужно изменить, это:

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

к

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

поэтому я использовал следующее, чтобы попытаться начать сначала:

Найти (set policy id (.+))и заменить на edit 0— похоже, это выделяет все и оставляет мне пустую конфигурацию, в которой осталось только изменить 0.

Затем я попробовал найти (set policy id *)и заменить на edit 0- это оставляет мне все, но изменяет так, что это выглядит так, как показано ниже: (По сути, вставляет 0 перед XXXX

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

Любая помощь будет очень признательна, так как это может сэкономить мне часы!!!!

решение1

ИМХО, вам следует написать сценарий на вашем любимом языке программирования.

Но если вы действительно хотите сделать эту работу с Ntepad++, вот решение regex. Как вы видите, regex и замена немного сложны и требуют хороших знаний для поддержки.

  • Ctrl+H

  • Найти то, что: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

  • Заменить: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

  • ПРОВЕРЯТЬ Учитывать регистр

  • ПРОВЕРЯТЬ Обернуть вокруг

  • ПРОВЕРЯТЬ Регулярное выражение

  • ПРОВЕРЯТЬ . matches newline

  • Replace all

  • Find All in Current Document

Объяснение:

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

Замена:

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

Снимок экрана (до):

введите описание изображения здесь

Снимок экрана (после):

введите описание изображения здесь

Вы найдете полное объяснениездесь

Связанный контент