Powershell (バージョン 4) を使用して、Windows 上の一連のファイルからテキストを抽出しようとしています。
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | Format-Table
ここまでは順調ですね。これにより、適切なMatchInfo
オブジェクトのセットが得られます。
IgnoreCase LineNumber Line Filename Pattern Matches
---------- ---------- ---- -------- ------- -------
True 30 ... file.jsp ... {...}
次に、キャプチャがmatchesメンバーにあることがわかったので、それらを取り出します:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | ForEach-Object -MemberName Matches | Format-Table
これにより、次のことが得られます。
Groups Success Captures Index Length Value
------ ------- -------- ----- ------ -----
{...} True {...} 49 47 ...
またはリストとして| Format-List
:
Groups : {matched text, captured group}
Success : True
Captures : {matched text}
Index : 39
Length : 33
Value : matched text
ここで停止します。さらに進んで、キャプチャされたグループ要素のリストを取得する方法がわかりません。
別の を追加してみまし| ForEach-Object -MemberName Groups
たが、上記と同じものを返すようです。
私が得る最も近い| Select-Object -Property Groups
ものは、実際に私が期待するもの(セットのリスト)を提供します:
Groups
------
{matched text, captured group}
{matched text, captured group}
...
しかし、それらのそれぞれからキャプチャされたグループを抽出することはできません。私| Select-Object -Index 1
はそれらのセットの 1 つだけを取得しようとしました。
更新:可能な解決策
追加すること| ForEach-Object { $_.Groups.Groups[1].Value }
で探していたものが得られたようですが、その理由がわかりません。そのため、このメソッドをファイルのセット全体に拡張したときに正しい結果が得られるかどうかはわかりません。
なぜ機能しているのですか?
補足として、これ| ForEach-Object { $_.Groups[1].Value }
(つまり、2 番目の なし.Groups
) は同じ結果になります。
さらに試してみると、パイプを削除することでコマンドを短縮できるよう| Select-Object -Property Groups
です。