2010-06-16 76 views
3

我正在使用正则表达式搜索来匹配和替换某些文本。文本可以跨越多行(可能有或没有换行符)。 目前我有这样的:查找跨越文本的多行并使用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"} 

回答

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,这样的选择可以传入创建

+2

我想你想'Where-Object {!$ _ PSIsContainer}',它绝对是一个更好的方式去IMO(与测试属性)。 – 2010-06-17 16:58:49

+0

@凯斯,我的错。谢谢 :) – stej 2010-06-17 17:02:43

1

试着改变你的正则表达式模式:

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

以获得单行(点匹配y char包括行结束符)。由于您没有使用^$元字符,我不认为您需要指定多行(^ & $匹配嵌入式行结束符)。

更新:看来,替换确保正则表达式不区分大小写,因此不需要i选项。

0

由于.与新行不匹配,所以应该使用(.|\n)+表达式来跨越行边界 。