[解決済み] Select-Stringからキャプチャされたグループを取得する方法は?
質問
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
のどちらかのセットしか得られません。
更新: 可能な解決策
どうやら
| ForEach-Object { $_.Groups.Groups[1].Value }
を追加することで、探していたものが得られたようですが、その理由がわかりません。したがって、このメソッドをファイルのセット全体に拡張したときに正しい結果を得られるかどうか確信が持てません。
なぜ動作しているのでしょうか?
余談ですが、この
| ForEach-Object { $_.Groups[1].Value }
(は、(つまり、2つ目の
.Groups
を使っても同じ結果になります。
さらに試行錯誤の結果、パイプでつながれた
| Select-Object -Property Groups
.
どのように解決するのですか?
下記をご覧ください。
$a = "http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$'
$a
は、現在では
MatchInfo
(
$a.gettype()
) を含んでいます。
Matches
プロパティが含まれます。
PS ps:\> $a.Matches
Groups : {http://192.168.3.114:8080/compierews/, 192.168.3.114, compierews}
Success : True
Captures : {http://192.168.3.114:8080/compierews/}
Index : 0
Length : 37
Value : http://192.168.3.114:8080/compierews/
を書くことができるように、グループメンバーであなたが探しているものを見つけることができます。
"http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$' | % {"IP is $($_.matches.groups[1]) and path is $($_.matches.groups[2])"}
IP is 192.168.3.114 and path is compierews
関連
-
[解決済み】REエラー:Mac OS Xでの不正なバイトシーケンス
-
[解決済み] 小数点以下2桁までの値にマッチする正規表現
-
[解決済み] 浮動小数点数に対する正規表現
-
[解決済み] 正規表現のメタ文字の違いについて
-
[解決済み] 正規表現、空白文字とコロンを除くすべての非英数字文字
-
[解決済み] JavaScriptの正規表現でマッチしたグループにアクセスするにはどうすればよいですか?
-
[解決済み] 文字列中の文字列出現回数を数えるには?
-
[解決済み] 文字列からダッシュ以外のすべての英数字を削除するには?
-
[解決済み] sedでキャプチャしたグループのみを出力するには?
-
[解決済み】キャプチャしたグループのみを置き換えるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] /bb|[^b]{2}/ どのように機能するのですか?[クローズド]
-
[解決済み] DartでRegExを使うには?
-
[解決済み] 正規表現で特定の単語を否定する方法は?重複
-
[解決済み] bashスクリプトで「cd `echo $0 | sed 's/(.***)\/.*/**1/'` 」はどうするのですか?
-
[解決済み] 文字列の最後の文字にマッチする正規表現[重複]について
-
[解決済み] what meas this regex (.*1) [duplicate] (重複)
-
[解決済み] 正規表現で複数行にまたがる任意の文字にマッチさせるにはどうしたらよいですか?
-
[解決済み] Powershellで完全一致の文字列のみを置換する
-
[解決済み] 正規表現 - 文字列で始まり、文字列で終わる
-
[解決済み] 一致した正規表現パターンを awk で表示するには?