2016-04-15 30 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*}'