我从大文本文件中提取信息。当我使用下面的代码执行此操作时,我的所有模式都会分开。我希望他们输出一个。
get-content c:\dev\test\data.txt | Select-String "First:","Last:" | Add-Content c:\dev\test\output.txt
目前这给了我:
约翰
母鹿
玛丽
史密斯
我想:
John Doe
玛丽史密斯
答案 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