如何削减价值直到特定的字符?

时间:2012-03-15 11:19:03

标签: powershell powershell-v2.0

我有一个数组$ IPAddress,其中包含IPv4和IPv6地址,如下所示。

  

IPAddress:{166.33.77.15,fe90 :: 68fe:7602:d981:2cb}

     

IPAddress:{166.33.77.18,fe87 :: 67c0:8476:3509:fb7a}

     

IPAddress:{166.33.77.65,fe80 :: c08e:f5ec:5095:e7ec}

我想在我的IPaddress数组中只存储IPv4地址。我需要在'{'直到','后切。如何使用PowerShell做到这一点?

4 个答案:

答案 0 :(得分:2)

如果结果是一个对象,那么你可以简单地执行:

$IPAddress[0]

如果是字符串,请尝试使用正则表达式:

'IPAddress : {166.33.77.15, fe90::68fe:7602:d981:2cb}' -replace '^IPAddress : {([^,]+).+$','$1'

答案 1 :(得分:0)

这是一种方式,但我认为(不是......我确定!)使用正则表达式有更好的方法!

$IPAddress = $IPAddress | % { $_.Substring( $_.IndexOf('{')+1 , $_.IndexOf(',') - ($_.IndexOf('{')+1))

编辑:使用正则表达式的简单方法(不验证IP地址是否是有效的ipaddress)

$IPAddress = $IPAddress |  select-string "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | select -ExpandProperty matches | select -ExpandProperty value

答案 2 :(得分:0)

您可以非常轻松地在PowerShell中使用正则表达式。

$IPAddress = @(`
    "IPAddress : {166.33.77.15, fe90::68fe:7602:d981:2cb}", `
    "IPAddress : {166.33.77.18, fe87::67c0:8476:3509:fb7a}", `
    "IPAddress : {166.33.77.65, fe80::c08e:f5ec:5095:e7ec}")

foreach($ip in $IPAddress) { 
    if ($ip -match "{.*,") {
        Write-Host $matches[0].substring(1, $matches[0].length - 2)
    }
}

$matches是一个特殊变量,使用-match运算符后设置。

答案 3 :(得分:0)

我得到了与Shay相同的答案,但我要补充一点,你不需要预先取代。它会立刻完成整个阵列:

$array -replace '^IPAddress : {([^,]+).+$','$1'