2010-07-01 2 views
1

У меня есть много текстового вывода из инструмента, который я хочу проанализировать в Powershell 2.0. Выход хорошо отформатирован, поэтому я могу создать регулярное выражение, чтобы вытащить нужные данные с помощью select-string. Однако получение последующих совпадений из select-string кажется длинным. Должен быть более короткий путь?Внимательно разбирать трубку

Это работает:

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

Но все эти матчи и значения многословны. В файле справки select-string нет ничего очевидного, но есть ли способ заставить его выкачать только регулярные выражения в виде строк? Немного как:

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

Хорошо, в этом контексте p4, так как я просто ищу первое слово вывода, я могу использовать 'p4 users | % {p4 changes -u $ _. Split() [0]} ', но притворяйтесь, что мне нужно регулярное выражение. – tenpn

ответ

2

В этом случае, это может быть немного проще в использовании -match например:

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

Это только потому, что выход Select-String является объектом MatchInfo, что хоронит матчи info на один уровень вниз. OTOH можно сделать так:

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

В вашем первом фрагменте я действительно хочу '$ matches [0]', но в противном случае это потрясающе. веселит. – tenpn

+0

Я предположил, что вам нужен только захват группы '(. \ W +)', но если $ matches [0] работает для вас, это круто. Я обновил ответ, чтобы это отразить. –