2017-04-24 39 views
1

我正在使用Regex在文件中選擇一個字符串。我的問題是,Select-String總是使用文件中的整行。這是我的代碼:Powershell中的Select-String正則表達式

($a = Select-String -path C:\Users\boriv\Desktop\Patrick\regex\spec.ini -pattern "PD[0-9]{3}[A-Z]{2}\n") 

我spec.ini文件看起來像這樣:

PD920_Package = PD920FA

[SPEC LOCATIONS] 
DV920_DataSource=Central Objects - DV920 
DV920_Package=DV920FA 
PD920_DataSource=Central Objects - PD920 
PD920_Package=PD920FA 
PS920_DataSource=Central Objects - PS920 
PS920_Package=PS920FA 
PY920_DataSource=Central Objects - PY920 
PY920_Package=PY920FA 

當輸出我從線只需要PD920FA

是否有其他方法可以通過Select-String

我也嘗試使用Where對象,但它沒有工作。

我正則表達式的工作,在以下鏈接: Regex

+0

你可以從另一個角度來處理這個 - 使用'(<=^DV920_Package =)PD \ d {3} [AZ] {2}'如果該值始終在行開始處的'DV920_Package ='後面。在末尾添加'$'以確保字符串的末尾被測試。 –

回答

1

您可以使用.NET [regex]::matchGet-Content

[regex]::match((Get-Content spec.ini),"PD[0-9]{3}[A-Z]{2}").value 
+0

但與Get-Content我得不到這個輸出。但是沒有** \ n **,它會給出整個行:PD920_Package = PD920FA – Doggo

+0

是的,我在測試中看到類似的情況,但假設我已將文件以與源文件不同的格式保存。問題在於,在PowerShell中,出於某種原因,正則表達式模式與字符串中的第一個PD匹配,並且看起來完全不符合\ n(換行符)字符。我很抱歉,我不是一個正則表達式專家,我認爲這個問題與正則表達式在PowerShell上的工作方式以及它在測試網站上的工作方式有所不同。 –

+1

我想通了,正則表達式測試者站點使用全局模式標誌,這意味着它在第一場比賽後不會停止。似乎你可以使用.NET方法'[regex] :: match'在PowerShell中做類似的工作。我已經修改了我的答案來證明這一點。 –