简而言之, 我需要在以" set ip"开头的长文件中找到一个特定的行。并继续我需要替换的一些参数。这一行在文件中出现多次,所以我需要在2个特定行之间找到它。
更长的故事: 我们很快将为我们的办公室配置许多FortiGate防火墙,大多数设置,策略等都是相同的,但外部IP更改,其他一些地址更改等。 因此,我尝试制作一个PowerShell脚本,它将采用现有配置(可能会更改)并找到我需要的特定行并替换它们。 我尝试使用正则表达式,但无法让它在多行上运行。 基本上我需要找到"设置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
遗憾的是,我没有尝试削减那部分文字,只搜索有效。 例如,我试过正则表达式:
get-content .\Fortigate.conf | select-string -pattern "^#","set uuid " -notmatch | select-string -Pattern '(?m)edit "wan1".*?end'
答案 0 :(得分:0)
对于这个问题,我不会尝试regex多行,但是以PowerShell的方式接近它“为管道中间实现”并记住您所在的部分的信息,例如:
阅读每个特定行(如果您编写cmdlet,请使用process
method部分):
get-content .\Fortigate.conf | ForEach {...
请记住当前的edit
部分:
$Wan = ($_ | Select-String 'edit[\s]+"(.*)"').Matches.Groups[1].Value
抓住(set
)部分中的特定edit
:
$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 $_}