我有一个多行字符串,我需要从字符串中得到一个单词。这个词就在文本后面的一行上:ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text,从字符57开始。
在Powershell中,返回从下面一行的字符位置57开始的单个单词最好的方法是什么?下面是一些我想返回文本I_NEED_TO_BE_FOUND的示例文本
Lorem ipsum dolor坐好了,敬请光临。后遗症前庭,马萨氏症。在hac栖息地高原上。Aenean前庭,dapibus quis dolor a,dictum hendrerit risus.基斯克也是前夫。Curabitur的诱惑使我们无法忍受。淫羊藿、淫羊藿、洋地黄。自由的自由,元素的三层欧盟,边缘的eget ipsum。
伊蒂姆·迪伊尼斯,白皙一片,一片白三叶。Duis hendrerit nunc id egestas tempus。这是一种很好的方法。马提斯( Phasellus enim,porttitor vulputate mattis )同坐,秃鹫等。[医]褐腐镰刀拍卖人,拍卖人,拍卖人。前庭前庭,大腹,缺锡。Sed有效剂量a累加。
ProcessStepLogID StartedAt时间返回代码进程名称命令文本
201605050000064594 2016-05-05 14:46:37.790 4秒1 I_NEED_TO_BE_FOUND A_Command
莫比中间前庭鼻甲,无皮囊状长毛象。羊齿状韧带,非乳状体。[医]马塞那斯( Maecenas tempus aliquam lacus )[医]杜仲,乌贼,乌贼。在hac栖息地高原上。毛皮土拨鼠,皂角拟菌。梅塞纳在埃尼姆、马列苏阿达、科莫多、埃米斯自由。
编辑
我试着修改@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]}发布于 2016-05-05 15:50:39
使用多行正则表达式。(看起来目标字符串实际上是从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:\> 发布于 2016-05-05 15:43:52
这可能是你的选择
$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中得到您想要的东西,或者可以进一步细化它,以便根据它们的值来理解属性名称。
https://stackoverflow.com/questions/37054314
复制相似问题