2016-05-05 1 views
0

У меня есть многострочная строка, и мне нужно получить одно слово из строки. Слово в строке, которая следует этот текст именно: ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text и начинается с символа 57.Как разобрать этот текст в Powershell?

Что бы быть лучшим способом в Powershell, чтобы вернуться, что одно слово, которое начинается в позиции символа 57 на следующей строке? Вот несколько примеров текста, где я хотел бы вернуть текст I_NEED_TO_BE_FOUND:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum в последующем neque, sed dictum massa. В hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum.

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Преданный egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Эффект Сед-де-дуй-акциан.

ProcessStepLogID StartedAt Время Взятый Код возврат Имя процесс Команда Текст
201605050000064594 2016-05-05 14: 46: 37,790 4 сек 1 I_NEED_TO_BE_FOUND A_Command

Morbi interdum преддверие turpis, ет pellentesque Фелис sollicitudin не. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus при эффективности. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. В hac habitasse platea dictumst. Donec suscitit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero.

EDIT

Я попробовал эту модификацию ответ @ mjolinor, но это не соответствует.

$text = @' 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum at consequat neque, sed dictum massa. In hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum. 

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Praesent egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Sed efficitur id dui a accumsan. 

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text 
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command 

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus at efficitur. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. In hac habitasse platea dictumst. Donec suscipit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero. 
'@ 

$regex = @' 
(?ms).+ 
^ProcessStepLogID 
(.+) 
.+ 
'@ 

if ($text -match $regex) 
    {$matches[1].Split()[6]} 

ответ

3

Использование многострочного регулярного выражения. (Похоже, что ваши целевые строки фактически начинаются с позиции 52)

PS C:\> $text = @' 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum at consequat neque, sed dictum massa. In hac habitasse platea dictumst. Aenean ante justo, dapibus quis dolor a, dictum hendrerit risus. Quisque sit amet porttitor ex. Curabitur tempor sed augue nec congue. Vestibulum lectus sem, iaculis quis dignissim at, condimentum sed diam. Ut libero quam, elementum egestas tristique eu, fringilla eget ipsum. 

Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. Duis hendrerit nunc id egestas tempus. Praesent egestas viverra orci id pretium. Phasellus augue enim, porttitor vulputate mattis sit amet, vulputate et diam. Fusce vitae tempus nisi. Sed auctor mi mollis pellentesque cursus. Sed vel quam vestibulum, pulvinar magna vel, tincidunt nisi. Sed efficitur id dui a accumsan. 

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text 
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command 

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. Ut dignissim ligula velit, non commodo tellus sodales lacinia. Maecenas tempus aliquam lacus at efficitur. Duis turpis tellus, condimentum ut ullamcorper ac, porttitor quis urna. In hac habitasse platea dictumst. Donec suscipit velit turpis, quis pretium sapien suscipit quis. Maecenas at enim ac nibh malesuada commodo eget quis libero. 
'@ 

$regex = @' 
(?ms).+ 
ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text.*? 
(.+) 
.+ 
'@ 

if ($text -match $regex) 
    {$matches[1].Split()[6]} 

I_NEED_TO_BE_FOUND 

PS C:\> 
+0

Настоятельно жаль об этом, но это должен быть текст после шестого пробела после матча. Не могли бы вы откорректировать свой ответ? Мне было интересно, подходит ли String.Split? –

+0

Скорректированный ответ для новых требований .. – mjolinor

+0

Ваш пример работает, но он не работает с реальными данными. Я думаю, что это потому, что у меня есть некоторые вкладки между некоторыми словами в этой строке 'ProcessStepLogID StartedAt'.Как бы вы изменили регулярное выражение так, чтобы оно соответствовало строкам после того, как оно начиналось с 'ProcessStepLogID'? Другими словами, соответствие всей строке после той, которая начинается с ProcessStepLogID. Я отредактировал свой вопрос, чтобы показать свою попытку. –

1

это может быть вариантом для вас

$string = @' 
Etiam dui nisi, blandit a tempus vitae, dictum ultricies neque. 

ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text 
201605050000064594 2016-05-05 14:46:37.790 4 sec 1 I_NEED_TO_BE_FOUND A_Command 

Morbi interdum vestibulum turpis, ut pellentesque felis sollicitudin non. 
'@ 

$array = $string.Split("`n") 

$selection = $array | select-string -Pattern 'processsteplogid' -Context 1 

$csvstring = $selection.ToString().Split("`n").Trim('> ').Replace(' ', ',') | select -Skip 1 

$obj = $csvstring | ConvertFrom-Csv 

$obj 

после просмотра ответ mjolinor, вот как я бы создать объект, используя регулярное выражение, и я думаю, что результат от этого выглядит лучше, чем мой предыдущий пример

$regex = '(ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text\r?\n.*)' 

$obj = if ($string -match $regex) { 
    $Matches[1].Split("`n") | ConvertFrom-Csv -Delimiter ' ' 
} 

$obj 

из пространств, пары имя объекта-значение может быть нонсенс, но - при условии, что всегда будет такое же количество мест - вы можете получить то, что лет u хочет из $ obj.process, или это может быть дополнительно уточнено, чтобы понять имена свойств по отношению к их значениям.