PowerShell的:两个字符串
我下到的数据变量$ OUT之间获得的数据(类型为对象[]):PowerShell的:两个字符串
Success...
Go!
0:#217> trace && .quit
0x000 Subline : _OK
0x008 Timed : NO
0x016 Check : _OK
0x022 Post :
0x030 Offset : None
0x038 Hint : False
0x050 NextHint : False
quit:
我需要串0之间提取文本:#217>跟踪& & .quit和退出: 我写道:
[Regex]::Match($out, "(?<=.quit').+?(?=quit:)").Value
但所需要的数据进行(String类型)这个提取物,而不是一列(对象[])。如何解决这个问题?
P.S. 我自己解决了这个问题如下
([Regex]'(?is)(?:(?<=\.quit).+(?=quit:))').Match(($out -join "`n")).Value
但也许有做这更完美的方式?
问题解决
([Regex]'\s+0x([^q]+)').Match(($out -join "`n")).Value
只需使用-split
功能来创建结果的String[]
:
$result = ([regex]::Match($a, '\.quit(.*)quit:').Groups[1].value) -split [System.Environment]::NewLine
不起作用。我有同样的结果。 – kate
尝试使用'n –
[编辑:这将工作,如果$out
是String[]
,例如从$out = Get-Content results.txt
,从你的其他评论,你可能会有不同的东西]。
作为一般的方法,有一个真/假的标志,它选择是否允许行通过,当你看到第一行然后设置标志,并且当你看到最后一行时,改变标志。
$middle = foreach ($line in $out) {
if ($line -match '^quit') { $allow = $false }
if ($allow) { write-output $line }
if ($line -match '0:#217>') { $allow = $true }
}
测试的顺序决定开始或结束行是否显示在结果中。
这可以在控制台输入上被缩短,到是这样的:
# loop # end line clears flag # print? # start line sets flag
$out |% { if($_ -match '^quit'){$f=0}; if ($f){$_}; if ($_ -match '0:#217>'){$f=1} }
分割是的,是的......在循环中获取所需的数据是非常糟糕的主意! – kate
...为什么这是一个“非常糟糕的主意”? – TessellatingHeckler
这可能会实现,但它做了一些假设:
$out -match '^ '
- $出去始终是一个字符串[]。如果它可能是单个字符串,则强制使用
@($out)
。 - 您正在使用PowerShell v4或v5,因此
-operator
将充当阵列上的过滤器。 - 您的示例数据是准确的,您想要的所有行都以空格开头,而其他所有行都不是。
当我运行一个'的String []'正则表达式这些来自'GET-Content',我没有得到任何结果。在String []上使用@jisaak的答案,我确实得到了结果 - 而你没有。你是如何创建'$ out'的? – TessellatingHeckler