Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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
使用PowerShell进行部分字符串替换 问题_Powershell_Replace - Fatal编程技术网

使用PowerShell进行部分字符串替换 问题

使用PowerShell进行部分字符串替换 问题,powershell,replace,Powershell,Replace,我正在编写一个脚本,让用户提供一个特定的IP地址,我想以某种方式屏蔽这个IP,这样它就不会存储在日志中。我的问题是,当我知道IP的前三个值通常是什么时,我可以很容易地做到这一点;但是,我希望尽可能避免将这些值存储/硬编码到代码中。我还希望能够替换这些值,即使我不知道前三个值 示例: 10.11.12.50 would display as XX.XX.XX.50 10.12.11.23 would also display as XX.XX.XX.23 我已经查找了部分字符串替换,但是我发现的

我正在编写一个脚本,让用户提供一个特定的IP地址,我想以某种方式屏蔽这个IP,这样它就不会存储在日志中。我的问题是,当我知道IP的前三个值通常是什么时,我可以很容易地做到这一点;但是,我希望尽可能避免将这些值存储/硬编码到代码中。我还希望能够替换这些值,即使我不知道前三个值

示例:

10.11.12.50 would display as XX.XX.XX.50
10.12.11.23 would also display as XX.XX.XX.23
我已经查找了部分字符串替换,但是我发现的问题中没有一个接近于此。我试过做一些事情,比如:

# This ended up replacing all of the numbers
$tempString = $str -replace '[0-9]', 'X'
我知道我已经做到了一半,但我的目标是只替换前3组数字,所以基本上每个数字都在“.”之前,但我还没能做到这一点

问题: 我试图通过PowerShell实现的目标可能实现吗?有没有实现这一目标的最佳实践方法?

以下是一个如何实现这一目标的示例:

Get-Content 'File.txt' |
  ForEach-Object { $_ = $_ -replace '\d{1,3}\.\d{1,3}\.\d{1,3}','xx.xx.xx' }
本例将一个数字匹配1-3次,即一个文字周期,并继续该模式,因此它将捕获
0-999.0-999.0-999
中的任何内容,并替换为
xx.xx.xx

是解决问题的确切方法(仅当3个连续的
分隔的1-3个数字组匹配时才会发生替换)

一个更宽松但更短的解决方案,它取代了除最后一个带前缀的数字组之外的所有内容:

PS> '10.11.12.50' -replace '.+(?=\.\d+$)', 'XX.XX.XX'
XX.XX.XX.50
(?=\。\d+$)
是一个(正)(
(?=…)
)匹配封闭的子表达式(一个文本
,后跟字符串(
$
)末尾的一个或多个数字(
\d
),但不会将其作为整体匹配的一部分捕获

净效果是,只有
+
捕获的内容(在前瞻断言匹配之前的所有内容)被替换为
'XX.XX.XX'

应用于上述示例输入字符串,
10.11.12.50

  • (?=\.\d+$)
    匹配末尾的
    -前缀数字组,
    .50

  • +
    匹配
    .50
    之前的所有内容,即
    10.11.12

  • 由于未捕获
    (?=…)
    部分,因此它不包含在被替换的内容中,因此被替换的只是子字符串
    10.11.12
    ,即
    XX.XX.XX
    ,因此产生
    XX.XX.XX.50


使用正则表达式替换相关的post-PERFECT!!非常感谢。这给了我想要的控制。我试图选择这个作为答案,但它告诉我,现在选择答案++还为时过早,但我假设您不是有意将
$\u=
放在那里(通常应该避免分配给
$\u
,在这种情况下,它也会阻止输出).@mklement0如果要在当前脚本块中重复使用
$\uuu
,这是有意的,也可以这样做。我不知道他的用例,但看起来他只是想在他的控制台输出中混淆它,所以我的示例部分适用于他的确切用例。@不可纠正1:明白,但请注意,当您分配给
$\uucode>时,这将产生一个编辑器警告(将引擎中的
$\uuu
设为只读最终被拒绝,以避免破坏现有代码)。@mklement0读起来非常有趣。总体而言,这是一个不错的决定,有点像遗留代码。@Brandon:正确;我再次更新了答案,以用一个具体的例子解释它。