PowerShell:获取两个字符串之间的数据

问题描述 投票:0回答:5

我已将下一个数据放入变量 $out (类型为 Object[]):

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> trace && .quitquit: 之间的文本 我写道:

[Regex]::Match($out, "(?<=.quit').+?(?=quit:)").Value

但这会将所需数据提取到一行(字符串类型)中,而不是列(Object[])中。如何解决这个问题?

附注 我自己解决了问题如下

([Regex]'(?is)(?:(?<=\.quit).+(?=quit:))').Match(($out -join "`n")).Value

但也许有更完美的方法来做到这一点?

powershell
5个回答
1
投票

问题解决了

([Regex]'\s+0x([^q]+)').Match(($out -join "`n")).Value

1
投票

以下是非常简单的搜索,获取起始字符串和结束字符串之间的字符串数据。

  • 优点 - 非常简单
  • 缺点 - 对于具有多个匹配等的数据效果不佳

代码

Function Get-StringBetweenStartEnd {
    Param($Text,$Start,$End)
    $Regex = [Regex]::new("(?<="+$Start+")(.*)(?="+$End+")")           
    $Match = $Regex.Match($String)           
    if($Match.Success) { Return $Match.Value} else {Return ""}
}

用法示例

$String = "Test: disconnected: 10.10.10.1::59270 (VNC Viewer closed)"           
$Result = Get-StringBetweenStartEnd -Text $String -Start "nected:" -End "::"
$Result.Trim()

# Output:
10.10.10.1

0
投票

只需使用

-split
函数即可创建结果的
String[]

$result = ([regex]::Match($a, '\.quit(.*)quit:').Groups[1].value) -split [System.Environment]::NewLine

0
投票

[编辑:如果

$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} }

0
投票

这可能有效,但它做了一些假设:

$out -match '^ '
  1. $out 始终是 String[]。如果它可能是单个字符串,请使用
    @($out)
    强制它。
  2. 您使用的是 PowerShell v4 或 v5,因此
    -operator
    将充当数组上的过滤器。
  3. 您的示例数据是准确的,您想要的所有行都以空格开头,而所有其他行都不是。
© www.soinside.com 2019 - 2024. All rights reserved.