【问题标题】:Partial String Replacement using PowerShell使用 PowerShell 替换部分字符串
【发布时间】:2017-09-06 00:36:10
【问题描述】:

问题

我正在编写一个让用户提供特定 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 实现?是否有实现这一目标的最佳实践方法?

【问题讨论】:

标签: powershell replace


【解决方案1】:

下面是一个一个示例,说明如何做到这一点:

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

【讨论】:

  • 完美!!谢谢你。这给了我想要的控制。我试图选择这个作为答案,但它告诉我现在选择答案还为时过早
  • ++,但我认为您并不是要将$_ = 放在那里(通常应避免分配给$_,在这种情况下它也会阻止输出)。跨度>
  • @mklement0 如果您要在当前脚本块中重复使用$_,这是有意的,也很好。我不知道他的用例,但看起来他只是想在他的控制台输出中混淆它,所以我的示例部分适用于他的确切用例。
  • @TheIncorrigible1:明白,但请注意changes are coming 在分配给$_ 时会产生编辑器警告(使$_引擎 中只读最终被拒绝以避免破坏现有代码)。
  • @mklement0 读起来很有趣。总体而言,这是一个不错的决定,有点像遗留代码。
【解决方案2】:

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

一个更松散但更短的解决方案,替换除了最后一个.-prefixed 数字组之外的所有内容:

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

  • 1234563 @,结果产生XX.XX.XX.50

【讨论】:

  • @Brandon:正确;我再次更新了答案,用一个具体的例子来解释它。
猜你喜欢
  • 2021-03-25
  • 2021-03-20
  • 2016-01-19
  • 1970-01-01
  • 2014-04-19
  • 2012-07-17
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多