具有多个模式的select-string,一行输出

时间:2015-06-05 12:54:50

标签: powershell

我从大文本文件中提取信息。当我使用下面的代码执行此操作时,我的所有模式都会分开。我希望他们输出一个。

get-content c:\dev\test\data.txt | Select-String "First:","Last:" | Add-Content c:\dev\test\output.txt

目前这给了我:

  

约翰
  母鹿
  玛丽
  史密斯

我想:

  

John Doe
  玛丽史密斯

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

$text = @"
First: John
Last: Doe
lasld

First: Mary
dasd
Last: Smith
"@

$text | Select-String '(?s)First:\s+(\w+).*?Last:\s+(\w+)' -AllMatches |
ForEach-Object { $_.Matches } |
ForEach-Object { "$($_.Groups[1].Value) $($_.Groups[2].Value)" }

输出:

John Doe
Mary Smith

它需要输入作为单个多行字符串,因此您需要使用$text = Get-Content "c:\dev\test\data.txt" -Raw$text = (Get-Content "c:\dev\test\data.txt") -join [environment]::NewLine

Regex101:https://regex101.com/r/bD2oU3/1

更新:我意识到有些人可能会有中间名,所以只要该行的名称与样本一样,您就可以使用下面的正则表达式来包含多于&之后的第一个单词。 #34;第一:"和"最后:"。它还删除了行

上的尾随空格
$text = @"
First: John Lala     
Last: Doe
lasld

First: Mary
dasd
Last: Smith Test
"@

$text | Select-String '(?ms)First:\s+(.*?)\s{0,}$.*?Last:\s+(.*?)\s{0,}$' -AllMatches |
ForEach-Object { $_.Matches } |
ForEach-Object { "$($_.Groups[1].Value) $($_.Groups[2].Value)" }

John Lala Doe
Mary Smith Test