2012-03-15 49 views
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}

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

+2

您是否尝试过的东西?你有一个想法如何做到这一点? – stej 2012-03-15 11:22:03

+0

@stej:可能会使用.net中的某些子字符串方法。我还没有使用在的powershell – Samselvaprabu 2012-03-15 11:23:15

+2

这看起来像格式-List'的'的输出具有一个属性'IPAddress'其是地址数组对象。在这种情况下,你会*疯狂*抛出字符串操作或正则表达式。毕竟,你有* PowerShell * ;-) – Joey 2012-03-15 11:47:52

回答

2

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

$IPAddress[0] 

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

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

是的,我在想对象;) – 2012-03-15 11:34:35

+0

最后,我发现它是某种对象。我无法对它们应用字符串函数。感谢提示。 – Samselvaprabu 2012-03-15 14:32:19

0

这是一种方式,但我认为(不。 ..我敢肯定!)有更好的东西使用正则表达式!

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

编辑:用正则表达式简单的方法(不验证,如果IP地址是有效的ip地址)

$IPAddress = $IPAddress | select-string "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | select -ExpandProperty matches | select -ExpandProperty value 
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操作之后设置一个特殊的变量。

0

我收到了与Shay几乎相同的答案,但我会补充说您不需要对foreach进行foreach。它会做整个数组一次:

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