簡體   English   中英

如何在 PowerShell 中使用 $regex 組合多個模式搜索並生成單行 output

[英]How to combine multiple pattern searches and produce a single line output using $regex in PowerShell

在此處輸入圖像描述

我正在導入一個文本文件並只提取我需要的數據。 我制作了一個模式,可以找到我正在尋找的信息。 但是,當它是 output 時,我希望每行提取的所有數據都在同一行上。 有沒有辦法讓程序在每次找到模式時都不會換行? output 文件應具有每行的 ID、名稱和節。

在此處輸入圖像描述

提出的每個解決方案都假設有關個人的所有數據都存在於一行中。

由於Select-String中的每個 output 將是文件中每行的一個MatchInfo object,因此您只需連接每個 object 的Value屬性值。

Select-String -Path $input_path -Pattern $regex -AllMatches |
    Foreach-Object {$_.Matches.Value -join ","} > $output_file

所有這些都假設您的匹配順序在您的文件中是可預測的。 如果它們與該模式不同,那么這會變得稍微復雜一些。


如果您將正則表達式更改為使用命名捕獲組,則使用無序文件時您的結果可能更容易預測。 不過,您仍然需要在文件中維護字段格式。

$regex = '\b(?<ID>\d{8})\b|\b(?<Name>[A-Z][a-zA-Z]*\s[A-Z][a-zA-Z]*)\b|\b(?<Section>[A-Z]+\d{3})\b'

Select-String -Path t.txt -Pattern $regex -AllMatches |
    Foreach-Object {
    $groups = $_.Matches.Groups.where{$_.Success}
    $ID = $groups.where{$_.Name -eq 'ID'}.Value
    $Name = $groups.where{$_.Name -eq 'Name'}.Value
    $Section = $groups.where{$_.Name -eq 'Section'}.Value
    $ID,$Name,$Section -join ","
    }

上面的代碼使用具有語法(?<captureName>)的命名捕獲組。


另一種選擇是只使用帶有-Regex-File參數的switch語句。 然后捕獲組甚至無關緊要,但每個正則表達式必須每行有一個匹配項。

$output = switch -Regex -File $input_File {
    '\b\d{8}\b' {
        $ID = $matches[0]
    }

    '\b[A-Z][a-zA-Z]*\s[A-Z][a-zA-Z]*\b' {
        $Name = $matches[0]
    }
    '\b[A-Z]+\d{3}\b' {
        $Section = $matches[0]
    }
    '$' {
        $ID,$Name,$Section -join ","
    }
}
$output > $output_file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM