Powershell - 用通配符替换文本,没有任何内容?

Powershell - 用通配符替换文本,没有任何内容?

我正在 Windows 批处理文件中使用 Powershell 命令来搜索如下文本字符串:(foo=1 其中1可以是任何内容)

我知道.*?在 Powershell 中通配符的作用。下面的代码片段不是完整的命令,我只放了相关部分。

foo=1我正在尝试使用 Powershell 通配符将整行替换为空,.*?如下所示1

-replace 'foo=.*?', ''

问题是,我没有留下一个空白行,而是留下了尾随的=1

我不知道为什么通配符没有按照上面代码框中的命令被替换为空。

在此先感谢任何对此有所启发的答案。

答案1

.?*不是“通配符”电源外壳

运营-Replace电源外壳不使用通配符匹配,它使用正则表达式。

在正则表达式中,.将匹配任何单身的字符(换行符除外)。和?*以及+量词与 或其他更具体的匹配字符一起使用.。因此:

  • '.?'匹配不匹配或匹配一个字符
  • '.*'匹配零个或多个字符
  • '.+'匹配一个或多个字符

通配符电源外壳-Like被and运算符使用-notLIke,也可用于轻松指定多个路径。除了大多数人熟悉的*and之外,括号 ( & ) 还可用于定义字符范围或枚举。这就是为什么名称中带有括号字符的路径需要使用参数的原因。?[]-LiteralPath

因此,对于您的问题/示例,您需要一个简单的正则表达式。但是“1可以是任何东西”留下了几个选择:

  • 始终为单个字符
    • -replace 'foo=.'
  • 直到字符串末尾的一个或多个字符。
    • -replace 'foo=.+$'
  • 一个或多个字符,直到空格(或其他已知分隔符)
    • -replace 'foo=.+\ ' # space
    • -replace 'foo=.+,' # comma

答案2

我继续捣鼓,终于弄明白了:

-replace 'foo=.*?.*', ''

在原始通配符后添加额外的内容.*使其起作用。

好的,现在我有好几个小时的工作要做;)

相关内容