【问题标题】:PowerShell String replacement with a wildcard使用通配符替换 PowerShell 字符串
【发布时间】:2016-10-08 23:14:05
【问题描述】:

我需要通过 PowerShell 替换的 SQL 文件中有一个版本号。在文件中是这样的:

values
   ('Current', '15.7.1.0'),
   ('New', '15.7.22.0')

我需要用当前版本替换它,但由于我不知道当前版本号将是什么,也不知道它的确切长度(数字计数可能会随着前导而改变不使用零),我需要使用通配符,而我正在尝试的方法不起作用。

目前这是我正在尝试的:

$content = Get-Content C:\Users\user\Desktop\sql\file.sql
$newContent = $content -replace "'Current', '*'", "'Current', '$newVersion'"

它实际上会找到并替换它,但由于某种原因不是全部。运行之后,我得到的是:

values
   ('Current', '16.6.21.0'15.7.1.0'),
   ('New', '15.7.22.0')

所以它肯定会在文件中找到正确的位置并对其进行替换,但实际上并没有替换版本号。谁能告诉我我做错了什么?

【问题讨论】:

  • -replace 使用正则表达式而不是通配符。
  • 您将完全替换您指定的内容:0 个或多个 's 后跟一个 '。由于开头的单引号符合条件 (0 's + '),因此它将整个字符串替换为开头的引号。

标签: string powershell replace


【解决方案1】:

正如@PetSorAl 所说,-replace 使用通配符而不是正则表达式。

以下是基于您的示例。

示例

$content = @"
values
   ('Current', '15.7.1.0'),
   ('New', '15.7.22.0')
"@

$newVersion = '16.6.21.0'
$newContent = $content -replace "'Current', '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'", "'Current', '$newVersion'"
Write-host $newContent

结果

values
   ('Current', '16.6.21.0'),
   ('New', '15.7.22.0')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2012-02-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多