Parsing 如何在Powershell中解析此文本?

Parsing 如何在Powershell中解析此文本?,parsing,powershell,powershell-3.0,Parsing,Powershell,Powershell 3.0,我有一个多行字符串,我需要从字符串中获取一个单词。该词正好位于本文后面的一行: ProcessStepLogID开始于所用时间返回代码进程名称命令文本并从字符57开始 在Powershell中,返回下一行中以字符位置57开头的单个单词的最佳方式是什么?下面是一些示例文本,我想返回文本I\u NEED\u to\u FOUND: Lorem ipsum dolor sit amet,是一位杰出的献身者。内克会议的前庭,这是我的座右铭。在hac habitasse Plateum,一句名言。这句话的

我有一个多行字符串,我需要从字符串中获取一个单词。该词正好位于本文后面的一行:
ProcessStepLogID开始于所用时间返回代码进程名称命令文本
并从字符57开始

在Powershell中,返回下一行中以字符位置57开头的单个单词的最佳方式是什么?下面是一些示例文本,我想返回文本
I\u NEED\u to\u FOUND

Lorem ipsum dolor sit amet,是一位杰出的献身者。内克会议的前庭,这是我的座右铭。在hac habitasse Plateum,一句名言。这句话的意思是:“我的朋友们,我的朋友们,我的朋友们。”。我是临时牧师,我是康格先生。前庭导板扫描电镜,雅库利斯尊严,调味品直径。自由广场,欧洲元素,欧洲元素

我是酒后驾车者,生活节奏缓慢,别有用心。杜伊斯·亨德雷特·努克·艾格斯塔斯·坦普斯。维维拉虎鲸(Praesent Egesta viverra orci id pretium)。Phasellus augue enim,vulputate mattis sit amet,vulputate et diam。这是我的生命。拍卖人mi mollis Pelletsque cursus。前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭。我的工作效率很高

ProcessStepLogID开始时间返回代码进程名称命令文本
20160505000064594 2016-05-05 14:46:37.790 4第1节我需要找到一个命令

前庭turpis中间的Morbi,是一种无症状的猫科动物。高贵的舌苔,非普通的苏打水。在效率上,时间是不平等的。杜伊斯turpis tellus,ullamcorper ac调味品,porttitor Qus urna。在hac habitasse Plateum,一句名言。多奈克·苏西皮特·维利特·图皮斯(Donec suscipit velit turpis)是一位智者。在埃尼姆ac nibh malesuada commodo eget quis libero的Maecenas

编辑

我尝试了对@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中获得所需的内容,或者可以进一步细化,以使属性名称与它们的值相关

这可能是您的一个选项

$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开始)

使用多行正则表达式。(看起来目标字符串实际上从位置52开始)


真的很抱歉,但是应该是比赛线后第六个空格后的文本。你介意调整一下你的答案吗?我想知道String.Split在这里是否合适?您的示例可以工作,但它不适用于实际数据。我想这是因为我在这行的一些单词之间有一些制表符
ProcessStepLogID StartedAt
。如何更改正则表达式,使其匹配以
ProcessStepLogID
开头的正则表达式后面的行?换句话说,匹配以ProcessStepLogID开头的一行之后的整行。我编辑了我的问题以显示我的尝试。调整了正则表达式。看看这是否适用于您的数据。我将正则表达式中的第二行更改为
ProcessStepLogID.*?
并且成功了,感谢您的耐心和帮助。对此非常抱歉,但应该是匹配线后第六个空格后的文本。你介意调整一下你的答案吗?我想知道String.Split在这里是否合适?您的示例可以工作,但它不适用于实际数据。我想这是因为我在这行的一些单词之间有一些制表符
ProcessStepLogID StartedAt
。如何更改正则表达式,使其匹配以
ProcessStepLogID
开头的正则表达式后面的行?换句话说,匹配以ProcessStepLogID开头的一行之后的整行。我编辑了我的问题以显示我的尝试。调整了正则表达式。看看这是否适用于您的数据。我将正则表达式中的第二行更改为
ProcessStepLogID.*?
并且成功了,感谢您的耐心和帮助。