これがまだ誰かにとって価値があるかもしれない場合、そして実際の要件に応じて、キースの答えの正規表現はそれほど複雑である必要はありません。ユーザーが単に各ブロックを出力したい場合は、以下で十分です。
$fileContent = [io.file]::ReadAllText("c:\file.txt")
$fileContent |
Select-String '(?smi)ap71xx[^!]+!' -AllMatches |
%{ $_.Matches } |
%{ $_.Value }
正規表現のap71xx[^!]*!
パフォーマンスは向上し.*
ます。予期しない結果が生じる可能性があるため、正規表現での使用はお勧めしません。パターン[^!]+!
は、感嘆符とそれに続く感嘆符を除くすべての文字に一致します。
ブロックの開始が出力で必要ない場合、更新されたスクリプトは次のとおりです。
$fileContent |
Select-String '(?smi)ap71xx([^!]+!)' -AllMatches |
%{ $_.Matches } |
%{ $_.Groups[1] } |
%{ $_.Value }
Groups[0]
一致した文字列全体Groups[1]
が含まれ、正規表現の括弧内に一致する文字列が含まれます。
それ以上の処理にが必要ない場合$fileContent
は、変数を削除できます。
[io.file]::ReadAllText("c:\file.txt") |
Select-String '(?smi)ap71xx([^!]+!)' -AllMatches |
%{ $_.Matches } |
%{ $_.Groups[1] } |
%{ $_.Value }