我正在尝试解析包含此格式文本块的文件(可能有1-n个):
-----------------------------------------------------------
KB Article Number(s): 2028769, 2072493, 2120979, 2143880, 2163958, 2163980, 980653, 980883, 981155, 981867, 982321, 982850
Language: All (Global)
Platform: x64
Location: (http://foo.bar.com)
Password: foo
-----------------------------------------------------------
如果有人有兴趣,该文本来自MS Hotfix请求电子邮件。
我有以下powershell一个班轮:
$file | select-string "(?<Name>\w+):(?<Value>.*)" -allmatches | SELECT @{N="Name";E={$_.Matches[0].Groups[1].Value}}, @{N="Value";E={$_.Matches[0].Groups[2].Value}}
这给了我一组平面的名称值对,我希望它返回一个哈希表数组,其中每个5个密钥都已填充。
我不确定问题是我的正则表达式还是我如何访问匹配(必须有一个不那么冗长的方法来挑选这些)。
答案 0 :(得分:4)
它不漂亮,但我认为它对你有用:
$ht = @{}
$file | %{if ($_ -match '(?<Name>[^:]+):(?<Value>.*)') {
$ht.($matches.Name) = $matches.Value.Trim()} `
elseif ($ht.Count) {$ht;$ht.Clear()}}
使用-match
运算符有点简单,因为您可以直接使用$ matches变量,而无需通过Select-String的MatchInfo.Matches属性。顺便说一下我假设这里$ file是通过调用Get-Content
来填充的,即每一行都是一个字符串数组中的字符串。