2015-09-10 126 views
1

我有一個很長的配置文件,我需要從中抽取一個子字符串,編輯其中的一些內容,並替換原始內容並保存該文件。我對PowerShell頗爲陌生,但我認爲最後兩部分我可以做。我遇到的問題首先是與正則表達式匹配。Powershell正則表達式用於兩個字符之間的多行字符串

[SECTION1] 
SETTING1=ABC 
SETTING2=DEF 
SETTING3=GHI 
[SECTION2] 
SETTING1=ABC 
ANOTHERSETTING=XYZ 
[SECTION3] 
SOMESETTING=DFH 
FINALSETTING=OWA 

我測試過上RegExr一個正則表達式,它的工作原理確定在那裏,但我還沒有嘗試到轉移到PowerShell腳本時,任何的喜悅。

(^\[SECTION2\](\n.+$){2}) 

我想要做的是找到「[SECTION2]」,並將所有內容匹配到「[」的下一個實例。我現在有它匹配「[SECTION2]」和兩條換行符,但想匹配到下一個方括號。

我已經嘗試了幾個命令來運行正則表達式,但似乎沒有任何東西給我帶回任何東西。例如:

Select-String -Path 'PATH_TO_FILE' -Pattern '(^\[SECTION2\](\n.+$){2})' 

我在做一些根本性的錯誤嗎?

回答

1

使用Select-String與一個文件將單獨運行模式針對每一行,但您需要匹配整個文件作爲一個大字符串。

模式也有問題。

嘗試是這樣的:

$matchObjects = Get-Content 'PATH_TO_FILE' -Raw | Select-String -Pattern '(?s)\[SECTION2\]([^\[]+)' 
$contents = $matchObjects[0].Groups[1].Value 

-Raw部分是什麼使Get-Content由線讀取整個文件的內容,而不是線,它需要的PowerShell 3+。

\[SECTION2\]([^\[]+) 

Regular expression visualization

Debuggex Demo

的圖案將查找[SECTION2]串,然後捕獲由一個或多個字符不屬於[的基團。

您可以使用一個名爲捕獲組也:

$matchObjects = Get-Content 'PATH_TO_FILE' -Raw | Select-String -Pattern '(?s)\[SECTION2\](?<Content>[^\[]+)' 
$contents = $matchObjects[0].Groups['Content'].Value 
+0

我已經編輯我原來的職位。我懷疑我沒有正確理解這個實現,所以對此有所幫助。我嘗試使用你提供的正則表達式,但是也沒有產生任何結果。 –

+0

@MikeWhitehead看到我的編輯。 – briantist

+0

我試過了你的建議,但它什麼都沒有返回。 Get-Content將文件拉入,所以第一部分實際上是讀取文件,但Select-String似乎無法找到匹配。例如,是否有任何方法來匹配[SECTION2]和[SECTION3]的開頭方括號之間的所有內容? –

相關問題