2012-08-03 68 views
3

我要替換文件夾中的每個腳本文件一些文本,我想用這個PS代碼:PowerShell的正則表達式組更換

$pattern = '(FROM [a-zA-Z0-9_.]{1,100})(?<replacement_place>[a-zA-Z0-9_.]{1,7})' 
Get-ChildItem -Path 'D:\Scripts' -Recurse -Include *.sql | ForEach-Object { (Get-Content $_.fullname) -replace $pattern, 'replace text' | Set-Content $_.fullname } 

但我不知道如何保持表達的第一部分,只需更換第二個。任何想法我怎麼能做到這一點?謝謝。

回答

9

不知道的表名提供正則表達式是正確的,但無論如何,你可以使用變量$1$2捕捉替換等,並按照syntax'Doe, John' -ireplace '(\w+), (\w+)', '$2 $1'

注意置換方式要麼需要在單引號('')或有置換組符轉義("$2 $ 1")的$跡象。

# may better replace with  $pattern = '(FROM) (?<replacement_place>[a-zA-Z0-9_.]{1,7})' 
$pattern = '(FROM [a-zA-Z0-9_.]{1,100})(?<replacement_place>[a-zA-Z0-9_.]{1,7})' 

Get-ChildItem -Path 'D:\Scripts' -Recurse -Include *.sql | % ` 
{ 
    (Get-Content $_.fullname) | % ` 
    { $_-replace $pattern, '$1 replace text' } | 
    Set-Content $_.fullname -Force 
} 

如果你需要引用您的替換式其他變量(你可能),你可以使用一個雙引號字符串,逃離捕捉美元與反引號

 { $_-replace $pattern, "`$1 replacement text with $somePoshVariable" } | 
+0

謝謝你,那正是我需要。在這種情況下,正則表達式的正確性並不重要,我只需要學習一種方法。 – hmnzr 2012-08-03 12:54:44

+0

謝謝,這在過去很有幫助。我現在遇到了麻煩,現在引用另一個變量,第一個捕獲和變量之間沒有空格,像這樣:'Foreach-Object {$ _ -replace $ pattern,'\'$ 1 $ version \'$ 3「}''。我想輸出' 1.1.35',但獲得'$ 11.1.35',顯然解析器沒有意識到我想在那裏捕獲。有沒有解決的辦法?如果我在捕獲和變量之間放置一個空間,但是之後我會有一個額外的空間,以後再打碎。 – Peter 2017-05-15 08:42:54

+0

@Peter你有沒有找到解決這個問題的方法?具有完全相同的問題 – user3700562 2018-01-24 13:18:41