如何在 Powershell 中解析此文本?

How to parse this text in Powershell?

我有一个 multi-line 字符串,我需要从该字符串中获取一个单词。这个词在一行中,正好跟在这段文字之后: ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text 从第 57 个字符开始。

在 Powershell 中 return 从下一行的字符位置 57 开始的单个单词的最佳方法是什么?这是一些示例文本,我想 return 文本 I_NEED_TO_BE_FOUND:

事实是疼痛本身很重要;它不是产品,而是质量。据说他就住在这条街上。 Aenean before just, dapibus quis dolor a, dictum hendrerit risus。每个人都应该是一家航空公司。聊一会,但不要打广告,不要做功课。我选择了这道菜,目标是尊严,但酱汁是 diam。为了自由,需要sad eu的元素,fringilla需要自己

连老天爷,若非奉承从今生,谓之不重。 Duis Hendrerit 现在需要那个时间。值得花钱看医学漫画。为晋升相,porttitor vulputate mattis sit amet, vulputate et diam。这只是你生命中的时间。但是我的作者是一个软弱的孩子。但要么是前厅,要么是大枕头,要么是键盘。但这是由 accumsan 完成的

ProcessStepLogID StartedAt Time Taken Return 代码进程名称命令文本
201605050000064594 2016-05-05 14:46:37.790 4 秒 1 I_NEED_TO_BE_FOUND A_Command

有病有时见于前庭,免得心烦意乱。为了获得合适的资产,对于Lacinium地区的成员来说,这不是一个好主意。 Maecenas 是取得一些成功的时候。 Duis turpis terlus,酱汁如 ullamcorper 和 portritor quis urna。据说他就住在这条街上。直到他接受高中,谁接受价格明智。然而,梅塞纳斯需要一个自由的人。

编辑

我尝试对@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]}

这可能是您的选择

$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

由于空格,对象名称-值对可能是无意义的,但是 - 假设总是有相同数量的空格 - 你可以从 $obj.process 中得到你想要的,或者这可以进一步细化以理解 属性 与其值相关的名称

使用多行正则表达式。 (看起来你的目标字符串实际上是从位置 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:\>