Powershell использует регулярное выражение для создания нового объекта хеш-таблицы - PullRequest
2 голосов
/ 13 июля 2010

Я пытаюсь проанализировать файл, содержащий блоки текста в этом формате (их может быть 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, если кому-то интересно.

У меня есть следующий вкладыш powershell one:

 $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 заполненных ключей.

Я не уверен, является ли проблема моим регулярным выражением или как я получаю доступ к матчам (Должен быть менее подробный способ их выбора).

1 Ответ

4 голосов
/ 13 июля 2010

Это не красиво, но я думаю, что это сработает для вас:

$ht = @{}
$file | %{if ($_ -match '(?<Name>[^:]+):(?<Value>.*)') {
          $ht.($matches.Name) = $matches.Value.Trim()} `
          elseif ($ht.Count) {$ht;$ht.Clear()}}

Использование оператора -match немного проще, потому что вы можете использовать переменную $ match напрямую, без необходимости выбиратьСвойство MatchInfo.Matches в строке.Кстати, я предполагаю, что здесь $ file был заполнен вызовом Get-Content, т.е. каждая строка является строкой в ​​массиве строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...