2014-02-18 89 views
0

我很難制定正則表達式以及在powershell腳本中放置它以提取一系列文件中命令的括號中的值(缺少文檔,因此我們正在提取從無數個文件可能傳遞值 - 不要問,它的我的痛苦)PowerShell正則表達式難度

我目前擁有的是:

Get-ChildItem -Recurse -Include *.* | Select-String "getBackOfficeCmdObject\(" | Out-File C:\work\found.txt 

現在,這是選擇所有包含該行「getBackOfficeCmdObject(」但我希望得到括號中包含的獨特/不同的值。

所以爲了清楚起見,

blah blah getBackOfficeCmdObject(val1) blah blah 
blah blah getBackOfficeCmdObject(val2) blah blah 
blah blah getBackOfficeCmdObject(val3) blah blah 
blah blah getBackOfficeCmdObject(val1) blah blah 
blah blah getBackOfficeCmdObject(val4) blah blah 
blah blah getBackOfficeCmdObject(val2) blah blah 

的數據集的工作,將導致文件的結果

val1 
val2 
val3 
val4 

從列表中選擇的唯一值。

感謝

回答

4

編輯,以返回唯一值:

+0

支持這幾乎做的一切我尋找。無論如何,我們可以唯一地排序和過濾結果嗎? PS怎麼到現在你的技能在正則表達式得到這個好?它就像(https://xkcd.com/208/) – SteveMustafa

+0

好的,所以我所做的就是向管道添加一個Get-Unique,並沒有解決得到獨特的結果。我的powershell命令現在看起來像這樣: Get-ChildItem -Recurse -Include *。* |貓| %{([regex] :: matches($ _,「(?<= getBackOfficeCmdObject \()。*(?= \))」))。value} |獲取唯一| Out-File C:\ Work \ found.txt – SteveMustafa

+0

幾乎在那裏,'get-unique'只能在排序列表上工作。我修改了答案(並感謝xkcd比較)。 – Raf

0

我認爲這應該工作:

$ht = @{} 
Get-Childitem -Recurse -Include *.* | 
Get-Content -ReadCount 1000 | 
    foreach { $_ -match 'getBackOfficeCmdObject\(' -replace '^.+getBackOfficeCmdObject\(([^)]+).+','$1' } | 
    foreach {$ht[$_]=$true} 


    $ht.keys | Out-File C:\work\found.txt 

使用與-ReadCount獲取內容來處理使用-match和-replace提取值在時間1000線。將這些值發送到一個散列表中,以便它們在流中被重定向,然後保存這些鍵。只有

^(?:.*)\s(?:.*)\s(?:getBackOfficeCmdObject\((val\d)\))\s(?:.*)\s(?:.*)$ 

它將只捕獲在您使用佔位符(VAL *)值...

0

你可能想給這個正則表達式捕獲一試。使用正則表達式回顧後
一個更簡潔的答案,抓住什麼的getBackOfficeCmdObject之前(和隨後

(?<=getBackOfficeCmdObject\().*(?=\))

這是由PowerShell的

Get-ChildItem -Recurse -Include *.* | 
    cat | % { 
     ([regex]::matches($_,"(?<=getBackOfficeCmdObject\().*(?=\))")).value} 
     | Sort | Get-Unique 
     | Out-File C:\work\found.txt