我有一个多行字符串,我需要从字符串中获取一个单词。这个词恰好在本文后面的一行:
ProcessStepLogID StartedAt Time Taken Return Code Process Name Command Text
并从角色57开始。
Powershell中最好的方法是返回从下一行的第57位开始的单个单词?这是一些示例文字,我想在其中返回文字I_NEED_TO_BE_FOUND
:
Lorem ipsum dolor坐下来,精神上的精神。在concquat neque的vestibulum,sed dictum massa。在hac habitasse platea dictumst。 Aenean ante justo,dapibus quis dolor a,dictum hendrerit risus。 Quisque坐在amet porttitor前。 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。塞德的效率值得积累。
ProcessStepLogID已启动时间返回代码进程名称命令文本
201605050000064594 2016-05-05 14:46:37.790 4秒1 I_NEED_TO_BE_FOUND A_Command
Morbi interdum vestibulum turpis,ut pellentesque felis sollicitudin non。 Ut dignissim ligula velit,nonmodo tellus sodales lacinia。 Maecenas tempus aliquam lacus效率。 Duis turpis tellus,condimentum ut ullamcorper ac,porttitor quis urna。在hac habitasse platea dictumst。 Donec suscipit velit turpis,quis pretium sapien suscipit quis。 Maecenas at enim ac nibh malesuada commodo eget quis libero。
修改
我试过@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]}
答案 0 :(得分:3)
使用多行正则表达式。 (看起来您的目标字符串实际上从第52位开始)
function saveSelection() {
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
return sel.getRangeAt(0);
}
} else if (document.selection && document.selection.createRange) {
return document.selection.createRange();
}
return null;
}
function restoreSelection(range) {
if (range) {
if (window.getSelection) {
sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
} else if (document.selection && range.select) {
range.select();
}
}
}
var specialDiv = document.getElementById("special");
var savedSel = null;
specialDiv.onmousedown = function() {
savedSel = saveSelection(); // save the selection
};
specialDiv.onmouseup = function() {
restoreSelection(savedSel); // restore the selection
};
答案 1 :(得分: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
因为空格,对象名称 - 值对可能是无意义的,但是 - 假设总是有相同数量的空格 - 你可以从$ obj.process得到你想要的东西,或者这可以进一步细化到理解与其值相关的属性名称