【问题标题】:How to select a string which starts with and ends with a pattern in powershell?如何在powershell中选择以模式开头和结尾的字符串?
【发布时间】:2021-04-10 19:32:03
【问题描述】:

我有一个包含以下数据的文本文件,我正在尝试获取以“WaitInstance”开头并以单引号结尾的字符串。

Some Data
Run 'WaitInstance -Id 000EACF-AAA-BBBB-9999-D864A60EDDF3' command to tell when it is available
Some Data

所以我想将上述文件中的以下数据放在一个变量中

WaitInstance -Id 000EACF-AAA-BBBB-9999-D864A60EDDF3

我正在使用以下代码来匹配模式,但 powershell 正在从文件中提取整行:

$SEL = Select-String -Path 'C:\Users\File.txt' -Pattern "WaitInstance"

【问题讨论】:

    标签: c# powershell powershell-3.0


    【解决方案1】:

    正则表达式的救援:

    $r = [RegEx]"(WaitInstance.*)'"
    
    Get-Content "C:\Users\File.txt" `
     | ForEach-Object { $r.Match($_) } `
     | Where-Object { $_.Success } `
     | ForEach-Object { $_.Groups[1].Value }
    
    

    要理解最终的代码块,您可以一次只做一行:

    管道输出文件的每一行:

    Get-Content "C:\Users\File.txt"
    

    管道输出文件的每一行,并将其转换为正则表达式匹配结果:

    Get-Content "C:\Users\File.txt" `
     | ForEach-Object { $r.Match($_) }
    

    管道输出文件的每一行,并将每一行转换为正则表达式匹配结果,并过滤掉与模式不匹配的那些

    Get-Content "C:\Users\File.txt" `
     | ForEach-Object { $r.Match($_) } `
     | Where-Object { $_.Success }
    

    将文件的每一行都用管道输出,并将每一行转换为正则表达式匹配结果,并过滤掉与模式不匹配的部分,然后提取你感兴趣的部分(即括号中的部分在正则表达式中):

    Get-Content "C:\Users\File.txt" `
     | ForEach-Object { $r.Match($_) } `
     | Where-Object { $_.Success } `
     | ForEach-Object { $_.Groups[1].Value }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多