2010-06-16 110 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)+表達式來跨越行邊界 。