使用PowerShell替换部分字符串

时间:2017-09-05 13:26:54

标签: 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

我查找了部分字符串替换,但我发现的问题都没有接近这样做。我尝试过这样的事情:

# This ended up replacing all of the numbers
$tempString = $str -replace '[0-9]', 'X'

我知道我在那里,但我的目标只是只替换前3组数字,基本上每个数字都在'之前。但是我没有能够做到这一点。

问题

我尝试使用PowerShell实现的目标是什么?是否有实现这一目标的最佳实践方法?

2 个答案:

答案 0 :(得分:2)

这是 示例,说明如何实现这一目标:

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

答案 1 :(得分:2)

TheIncorrigible1's helpful answer是解决问题的一种确切方法(仅当连续3个连续.个1-3位数的组匹配时才会发生替换。)

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

PS> '10.11.12.50' -replace '.+(?=\.\d+$)', 'XX.XX.XX'
XX.XX.XX.50

(?=\.\d+$)是一个(正)lookahead assertion(?=...)匹配所包含的子表达式(文字.后跟1个或更多字符串末尾的数字(\d),但不会捕获作为整体匹配的一部分。

净效果是只有$捕获的内容 - 在前瞻断言匹配之前之前的所有 - 都被.+替换。

应用于上面的示例输入字符串'XX.XX.XX'

  • 10.11.12.50匹配(?=\.\d+$) - 前缀为.的前缀数字组。

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

  • 由于未捕获10.11.12部分,因此它不包含在替换的中,因此只替换了子串(?=...),即使用10.11.12,结果会产生XX.XX.XX