2010-07-01 43 views
1

我有很多來自我想在Powershell 2.0中解析的工具的文本輸出。輸出格式很好,所以我可以使用select-string構造一個正則表達式來提取我想要的數據。然而,從選擇字符串中獲取後續匹配看起來很囉嗦。必須有一個更短的方式?簡明地解析管道

這工作:

p4 users | select-string "^\w+(.\w+)?" | 
    select -Expand Matches | %{p4 changes -u $_.Value} 

但所有這些比賽和價值觀是冗長。在選擇字符串幫助文件中沒有什麼明顯的,但是有沒有一種方法可以將正則表達式匹配作爲字符串抽出?如A位:

p4 users | select-string "^\w(.\w+)?" -ImaginaryMagicOption | %{p4 changes -u $_} 
+0

好的,在這個p4上下文中,因爲我只是尋找輸出的第一個單詞,所以我可以使用'p4 users | %{p4更改-u $ _。Split()[0]}',但假裝我需要正則表達式。 – tenpn 2010-07-01 09:48:01

回答

2

在這種情況下,它可能是一個有點更容易使用-match例如:

p4 users | Foreach {if ($_ -match '^\w+(.\w+)?') { p4 changes -u $matches[0] }} 

這只是因爲選擇字符串的輸出是MatchInfo對象,它埋匹配信息一級。 OTOH它可以工作:

p4 users | Select-String "^\w+(.\w+)?" | 
    Foreach {p4 changes -u $_.Matches[0].Value} 
+0

在你的第一個片段中,我實際上想要'$ matches [0]',但除此之外那真棒。乾杯。 – tenpn 2010-07-02 07:34:33

+0

我以爲你只是想要組捕獲'(。\ w +)',但如果$匹配[0]適合你,那很酷。我已經更新了答案以反映這一點。 – 2010-07-02 16:29:51