2016-04-15 84 views
0

我想要獲取具有{@}模式的文件中的所有佔位符。我試圖弄清楚所有的變量,但我無法定義結尾括號的模式,也不能定義整個單詞。以下是我的代碼到目前爲止使用模式@ {}使用Powershell獲取所有佔位符文件

$SampleText = "I need all the variables with @{abc} @{def} 
and @{xyz}" 
$Pattern = '@{\w*' 
$SampleText | Select-String -AllMatches -Pattern $Pattern 
| Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value 

這樣做我得到@ {abc,@ {def和@ {xyz作爲輸出。我需要獲得整個@ {abc},@ {def}和@ {xyz}。我試圖改變很多變化的$模式,它不是幫助

任何幫助?

回答

1

這裏有一個更簡潔的解決方案(PSv3 +):

$SampleText | % { [regex]::Matches($_, '@\{\w+\}').Value } 

注意,即使你,儘管你跑了不\ -escaping在{}您特定的正則表達式,通常應該這樣做,因爲它們是用於量詞的元字符(例如,{2}指定重複計數爲2)。

[regex]是PowerShell類型的加速器,類型爲[System.Text.RegularExpressions.Match],它提供了PowerShell的運營商提供的功能。

在這種情況下,靜態Matches方法返回全部匹配輸入字符串中指定的正則表達式,如[System.Text.RegularExpressions.Match]實例。 每個這樣的實例都將匹配的字符串記錄在其.Value屬性中,因此將.Value應用於整個匹配集合(其類型爲[System.Text.RegularExpressions.MatchCollection]),則單個匹配將作爲字符串數組返回。

+1

哇,這只是純金。非常感謝。我意識到現在我需要探索更多的選擇並且練習它們。 – VKarthik

+0

@VKarthik:謝謝;雖然PowerShell提供了許多高級功能,但有時直接使用.NET功能可以讓事情變得更簡單,或者使您能夠做事情.PowerShell不會讓您直接做。這是PowerShell靈活性的一個證明,即該選項可用。 – mklement0

0

啊,稍微挖一下。我想到了。該模式需要調整,如下圖所示 -

$Pattern = '@{\w*}'