我需要帮助从FortiGate防火墙配置文件中提取重复的配置块。它包含以下格式的各个部分。
每个vdom配置部分('configvdom'部分)都以2 'end'结束-我需要在下一步之前首先取出这些块。
#header info
config vdom
edit root
next
edit test
next
edit test2
next
end
config global
...
...
...
end
end
config vdom
edit root
config system
...
end
config ...
...
...
......
...
end
end
config vdom
edit test
config system
...
end
config ...
...
...
......
...
end
end
config vdom
edit test2
config system
...
end
config ...
...
...
...
end
end
我正在使用regex101.com来构建正则表达式,以便在python脚本中使用。(config vdom\nedit.+\nconfig[\s\S\r]*)
-匹配从第一个vdom配置开始的所有文本,直到文件结束,也包括其他vdom配置(config vdom\nedit.+\nconfig[\s\S\r]*?)
-仅匹配前3行,直到第一个“config”(config vdom\nedit.+\nconfig[\s\S\r]*?end\n)
-匹配文本,直到第一次出现'end' -整个配置中有多个'end',但每个vdom配置的末尾有2个(config vdom\nedit.+\nconfig[\s\S\r]*?end\nconfig)
-匹配文本,直到第一次出现'config',但如果我像下面这样使用'end'来匹配其中两个,它会失败(config vdom\nedit.+\nconfig[\s\S\r]*?end\nend\n\n)
-当尝试查找后面跟着空行的2个结尾的出现时,它失败并显示“灾难性回溯”
我不知道为什么当我在*?
之后使用一个end\n
时,它会工作,但当我尝试添加第二个时,它就会失败。
任何帮助将不胜感激!
2条答案
按热度按时间v9tzhpje1#
你可以匹配
设置了多行和单行模式。
多行模式使
^
和$
分别匹配行的开头和结尾,而不是字符串的开头和结尾。单行(也称为DOTALL)模式使
.
匹配所有字符,而不仅仅是行终止符以外的所有字符。Demo
正则表达式具有以下元素。
.*?
很不情愿,匹配尽可能少的字符,在下一个'config '
之前停止。相比之下,.*
很贪婪,匹配尽可能多的字符,吞噬'config '
的字符,直到匹配到最后一个字符。wbrvyc0a2#
另一个没有dotall模式的选项使用负前瞻,匹配模式的开始,然后是一行上不以2倍
end
开始的所有行:说明
^
字符串开头config vdom\r?\nedit\b.*
匹配config vdom
一个换行符,edit
和该行的其余部分(?:
非捕获组作为整体部分重复\r?\n
匹配换行符(?!end\r?\nend$).*
负先行,在一行上Assert不超过2次end
,如果是这种情况,则匹配整行)*
关闭非捕获组并重复2次\r?\nend\r?\nend
匹配2次换行符和end
$
字符串结束Regex demo