查找跨越文本的多行并使用PowerShell替换

时间:2010-06-16 22:53:25

标签: regex powershell

我正在使用正则表达式搜索来匹配和替换一些文本。文本可以跨越多行(可能有也可能没有换行符)。 目前我有这个:

 $regex = "\<\?php eval.*?\>"

Get-ChildItem -exclude *.bak | Where-Object {$_.Attributes -ne "Directory"} |ForEach-Object {
 $text = [string]::Join("`n", (Get-Content $_))
 $text -replace $RegEx ,"REPLACED"}

3 个答案:

答案 0 :(得分:5)

试试这个:

$regex = New-Object Text.RegularExpressions.Regex "\<\?php eval.*?\>", ('singleline', 'multiline')

Get-ChildItem -exclude *.bak |
  Where-Object {!$_.PsIsContainer} |
  ForEach-Object {
     $text = (Get-Content $_.FullName) -join "`n"
     $regex.Replace($text, "REPLACED")
  }

通过New-Object显式创建正则表达式,以便可以传入选项。

答案 1 :(得分:1)

尝试将正则表达式模式更改为:

 "(?s)\<\?php eval.*?\>"

获取单行(点匹配包括行终止符的任何字符)。由于您未使用^$元字符,因此我认为您不需要指定多行(^&amp; $匹配嵌入式行终止符)。

更新:似乎-replace确保正则表达式不区分大小写,因此不需要i选项。

答案 2 :(得分:0)

应该使用(.|\n)+表达式来跨越边界线 因为.与新行不匹配。