Regex 需要使用powershell从长配置文件中搜索一行

Regex 需要使用powershell从长配置文件中搜索一行,regex,powershell,Regex,Powershell,总之,, 我需要在一个长文件中找到一个特定的行,该行以“set ip”开头,并以一些需要替换的参数继续。这一行在文件中出现多次,因此我需要在两行之间找到它 长话短说: 我们将很快为我们的办公室配置许多FortiGate防火墙,大多数设置、策略等将是相同的,但外部IP更改、一些其他地址更改等。 因此,我正在尝试创建一个powershell脚本,它将采用现有配置(可能会更改),并找到我需要的特定行并替换它们。 我尝试使用regex,但无法在多行上使用它。 基本上,作为参考,我需要在以下部分找到“设置

总之,, 我需要在一个长文件中找到一个特定的行,该行以“set ip”开头,并以一些需要替换的参数继续。这一行在文件中出现多次,因此我需要在两行之间找到它

长话短说: 我们将很快为我们的办公室配置许多FortiGate防火墙,大多数设置、策略等将是相同的,但外部IP更改、一些其他地址更改等。 因此,我正在尝试创建一个powershell脚本,它将采用现有配置(可能会更改),并找到我需要的特定行并替换它们。 我尝试使用regex,但无法在多行上使用它。 基本上,作为参考,我需要在以下部分找到“设置ip”:

config system interface
    edit "wan1"
        set vdom "root"
        set ip 7.7.7.7 255.255.255.252
        set allowaccess ping https ssh
        set ident-accept enable
        set type physical
        set scan-botnet-connections block
        set alias "WAN1"
        set role wan
        set snmp-index 1
    next
(为了安全起见更改了IP)等等。 到目前为止,我得到的是:

get-content .\Fortigate.conf  | select-string -pattern "^#","set uuid " -notmatch
可悲的是,我没有尝试剪切文本的那一部分,只是在那里搜索有效。 例如,我尝试使用regex:

get-content .\Fortigate.conf  | select-string -pattern "^#","set uuid " -notmatch | select-string -Pattern '(?m)edit "wan1".*?end'

对于这个问题,我不会尝试regex multiple line,而是以PowerShell的方式“在管道中间实现”,并记住您所在的部分的信息,例如:

阅读每一行(如果要编写cmdlet,请使用以下部分):

记住当前的
编辑
部分:

get-content .\Fortigate.conf  | ForEach {...
$Wan = ($_ | Select-String 'edit[\s]+"(.*)"').Matches.Groups[1].Value
$SetIP = ($_ | Select-String 'set[\s]+ip[\s]+(.*)').Matches.Groups[1].Value
在(
编辑
)部分捕获特定的
集合

根据价值观和章节做出决定,例如:

If ($Wan -eq $MyWan) {
    if (($SetIP -Split "[\s]+") -Contains $MyIP) {...
将新字符串条目(中间)放到管道上:

Write-Output "        set ip $MyNewIP"
或保留原始字符串条目:

Else {Write-Output $_}

使用
-Raw
开关打开
获取内容
如果您想使用多行标志实际上,
(?m)
在这里是多余的,您想使用
(?s)
使
匹配LF字符吗?你只能使用它,如果你阅读整个文件,而不是逐行阅读它(见上面的评论)。我尝试了原始,但它对我没有任何作用,遗憾的是,我不了解几乎所有的正则表达式,它主要是复制和一些在线正则表达式检查器网站上的工作。所以,你有如上所示的文件,对吗?预期的结果是什么?最终应该是相同的文件,具有相同的结构,但某些细节发生了更改,例如,IP线现在将是:设置IP 5.5.5.5 255.255.255.250