Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用PowerShell以字符串格式更改IP的第三个八位字节_Regex_String_Powershell_Concatenation - Fatal编程技术网

Regex 使用PowerShell以字符串格式更改IP的第三个八位字节

Regex 使用PowerShell以字符串格式更改IP的第三个八位字节,regex,string,powershell,concatenation,Regex,String,Powershell,Concatenation,我想我找到了最糟糕的方法: $ip = "192.168.13.1" $a,$b,$c,$d = $ip.Split(".") [int]$c = $c $c = $c+1 [string]$c = $c $newIP = $a+"."+$b+"."+$c+"."+$d $newIP 但最好的办法是什么?完成时必须为字符串。不必为验证其合法IP而烦恼。使用您的示例了解如何修改第三个八位组,我将以几乎相同的方式执行此操作,但我会将一些步骤压缩在一起: $IP = "192.168.13.1"

我想我找到了最糟糕的方法:

$ip = "192.168.13.1"
$a,$b,$c,$d = $ip.Split(".")
[int]$c = $c
$c = $c+1
[string]$c = $c
$newIP = $a+"."+$b+"."+$c+"."+$d

$newIP

但最好的办法是什么?完成时必须为字符串。不必为验证其合法IP而烦恼。

使用您的示例了解如何修改第三个八位组,我将以几乎相同的方式执行此操作,但我会将一些步骤压缩在一起:

$IP = "192.168.13.1"
$octets = $IP.Split(".")                        # or $octets = $IP -split "\."
$octets[2] = [string]([int]$octets[2] + 1)      # or other manipulation of the third octet
$newIP = $octets -join "."

$newIP
从命令行复制到ps1文件并点源,然后键入

Replace-3rdOctet -GivenIP '100.201.190.150' -New3rdOctet '42'
输出:100.201.42.150


在此基础上,您可以为随机输入等添加额外的错误处理等。

这里有一个稍微不同的方法。[咧嘴笑]直到我做完这篇文章,我才注意到杰夫泽特林的答案

[编辑-感谢JeffZeitlin提醒我OP希望最终结果为字符串。哎呀![*blush*]]

它的作用

  • 在点上拆分字符串
  • 将其放入[int]数组并强制将项放入该类型
  • 增加目标插槽中的项目
  • 将项目重新连接到一个字符串中,并以点作为分隔符
  • 将其转换为IP地址类型
  • 添加一行以将IP地址转换为字符串
这是密码

$OriginalIPv4 = '1.1.1.1'
$TargetOctet = 3

$OctetList = [int[]]$OriginalIPv4.Split('.')
$OctetList[$TargetOctet - 1]++

$NewIPv4 = [ipaddress]($OctetList -join '.')

$NewIPv4
'=' * 30
$NewIPv4.IPAddressToString
输出

Address            : 16908545
AddressFamily      : InterNetwork
ScopeId            : 
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 1.1.2.1

==============================
1.1.2.1

您只需使用PowerShell的-replace操作符和前瞻模式即可。请看下面的脚本

Set-StrictMode -Version "2.0"
$ErrorActionPreference="Stop"
cls
$ip1 = "192.168.13.123"
$tests=@("192.168.13.123" , "192.168.13.1" , "192.168.13.12")
foreach($test in $tests)
{
    $patternRegex="\d{1,3}(?=\.\d{1,3}$)"
    $newOctet="420"
    $ipNew=$test -replace $patternRegex,$newOctet
    $msg="OLD ip={0} NEW ip={1}" -f $test,$ipNew
    Write-Host $msg

}
这将产生以下结果:

OLD ip=192.168.13.123 NEW ip=192.168.420.123
OLD ip=192.168.13.1 NEW ip=192.168.420.1
OLD ip=192.168.13.12 NEW ip=192.168.420.12
如何使用-replace操作符?

了解我使用的模式

\d{1,3}(?=。\d{1,3}$)中的(?=)表示向后看

在\d{1,3}(?=.\d{1,3}$)中的(?=.\d{1,3}$)表示点和1-3位后面的任何内容

前导\d{1,3}是专门匹配1-3位的指令

全部用通俗易懂的英语组合“给我1-3个位于句点后面的数字和1-3个位于字符串右侧边界的数字”

前瞻性正则表达式

校正


正则表达式模式是向前看而不是向后看。

如果您有PowerShell Core(v6.1或更高版本),您可以
-替换为基于脚本块的替换

PS> '192.168.13.1' -replace '(?<=^(\d+\.){2})\d+', { 1 + $_.Value }
192.168.14.1

PS>'192.168.13.1'-replace'(?完成您的方法,但很快:

$a,$b,$c,$d = "192.168.13.1".Split(".")
$IP="$a.$b.$([int]$c+1).$d"

一个有趣的解决方案;你为什么要强制执行严格的PS2.0语义?
(?=\.\d{1,3}$)
是一个前瞻性的解决方案。谢谢,但这不是+1。真的像这样,并验证了我的不是完全的垃圾。没有意识到拆分会让数组为你服务,非常感谢。是的,比我的好对不起,我不明白你说的是什么意思“保持兼容”?@Sau001-Windows PowerShell(PowerShell 5及更早版本)不支持替换参数的scriptblock;由于查询人未指定他使用的PowerShell版本,此答案很有用-但警告它不能与较旧版本的PowerShell一起使用(mklement0指出了以上我的答案)。我的答案将适用于PowerShell Core,但可能不是PowerShell Core的最佳答案,因为有了新的功能。这不是明确规定的要求,但OP自己的代码就是这样做的;不管怎样,我同意你的答案不应该被否决,当然不是没有反馈-我明白这很令人沮丧。
$a,$b,$c,$d = "192.168.13.1".Split(".")
$IP="$a.$b.$([int]$c+1).$d"