Powershell 正则表达式匹配多行并替换在多个文档中找到的一小部分内容

Powershell 正则表达式匹配多行并替换在多个文档中找到的一小部分内容

我正在使用 powershell 获取大量不同的文档,在其中找到一个模式,然后用其他模式替换该模式。我已经成功了,但是我现在试图扩展其中一个正则表达式以覆盖多行,以便更准确,但我不知道该怎么做。

我正在尝试寻找域\用户名即在某个元素中,并将其替换为新域保持其后的用户名与原先相同。例如

      <gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)-->
          DomainName\UserName
      </gMSA>

在 Notepad++ 中这是有效的:

寻找:

(\<gMSA>.*?\t)D.*?(\\.*?\</gMSA>)

代替:

$1NewDomain$2

但是这在 powershell 中不起作用。这就是我要用来替换文本的内容:

#Set Install set path
$ProfilePath = 'D:\Customers\Live'

#Update deployparameters in InstallSet Profiles
$DeployParam = Get-ChildItem $ProfilePath deployparameters.xml -rec
foreach ($file in $DeployParam)
{
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace '(<gMSA\>.*\t)D.*?(\\.*?</gMSA>)', '$1NewDomain$2' } |
    Set-Content $file.PSPath
}

我尝试过一些方法,比如\s让它*跨越多行,但我并不高兴。

提前谢谢了。

答案1

嗯,有趣……

继续我的评论。

如果你确定该模式仅存在于传递的字符串中

$MyString = @"
      <gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)-->
          DomainName\UserName
      </gMSA> 
      <gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)-->
          DomainName\UserName
      </gMSA>
      <gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)-->
          DomainName\UserName
      </gMSA>
"@ 

那为什么不直接问呢?

[regex]::Matches($MyString, '(\w.*\\.*)')
# Results
<#
Groups   : {0, 1}
Success  : True
Name     : 0
Captures : {0}
Index    : 143
Length   : 20
Value    : DomainName\UserName

...
#>

[regex]::Matches($MyString, '(\w.*\\.*)').Value
# Results
<#
DomainName\UserName
DomainName\UserName
DomainName\UserName
#>

答案2

@TessellatingHeckler 给出了我需要的答案。这是我的解决方案,只需添加-Raw(?s)

#Set Install set path
$ProfilePath = 'D:\Customers\Live'

#Update deployparameters in InstallSet Profiles
$DeployParam = Get-ChildItem $ProfilePath deployparameters.xml -rec
foreach ($file in $DeployParam)
{
    (Get-Content -Raw $file.PSPath) |
    Foreach-Object { $_ -replace '(?s)(<gMSA\>.*\t)D.*?(\\.*?</gMSA>)', '$1NewDomain$2' } |
    Set-Content $file.PSPath
}

相关内容