【问题标题】:regex can't be first element for pipeline - how get match正则表达式不能成为管道的第一个元素 - 如何匹配
【发布时间】:2023-02-01 02:12:19
【问题描述】:

我有一个在 Windows 10 命令行运行的正则表达式,并得到错误:

Expressions are only allowed as the first element of a pipeline.

我不确定如何将它与第一个元素中的匹配部分放在一起。

这是文档内容(显示了重要部分......有多个制造商和 S/N,但我只需要特定的):

e:\temp\details.txt:

...
  Manufacturer: SGSS
  S/N: A791D734804

...

我用这个powershell从文档中成功获取了以上两行代码,但是我在提取分号后的序列号时遇到了问题。

这用于提取制造商和 S/N 行(上下文部分也在模式匹配后获取行):

powershell "Get-Content e:\temp\details.txt | select-String -Pattern SGSS -Context 0,1" 

但是,我试图只返回序列号 (),并得到上面的错误。这是我收到匹配/命令错误的地方:

powershell "Get-Content -Raw e:\temp\details.txt | select-String -Pattern SGSS -Context 0,1 | $_ -match '(?ms)(N:\s)(([a-zA-Z0-9])+)'"

我测试了正则表达式在正则表达式测试器中是否有效:

(N:\s)(([a-zA-Z0-9])+)

我使用了这个 example for the match ,但由于我正在做的其他事情,我不能将它放在表达式中的第一位(如示例)。你有什么建议吗?

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    您可以在 ForEach-Object 脚本块中使用 Where-Object 和自动 $Matches 变量来获取您想要的内容:

    powershell "Get-Content e:	empdetails.txt | Where{$_ -match 'N:s([a-zA-Z0-9]+)'} | ForEach-Object {$Matches[1]}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 2014-06-30
      • 2011-02-20
      相关资源
      最近更新 更多