テキストファイルから正規表現使って文字列抽出したい場合、
PowerShellからこんなコマンドで一発で抽出できます。
[regex]::Matches((Get-Content 対象のファイル),"正規表現文字列","任意オプション") | foreach{$_.Value}
例えばXMLからCDATAの値を抽出してみます。
[regex]::Matches((Get-Content .\test.xml),"CDATA\[.*?\]") | foreach{$_.Value}
結果はこのようなイメージになります。
CDATA[XXX] CDATA[XXXXXX] CDATA[SSS] CDATA[YYYYYY]
もし、PowerShellだけで書くならこんな方法もあります。
PS>(get-content .\test.xml).foreach{if($_ -match "CDATA\[.*?\]"){$matches[0]}}
これは、$matchesという-matchを使った時に自動的に設定される変数を使った方法です。
正規表現検索のオプションとして指定できるのは以下のコマンドで取得できます。
[System.Text.RegularExpressions.RegexOptions]::GetNames([System.Text.RegularExpressions.RegexOptions])
結果はこちら。
None IgnoreCase Multiline ExplicitCapture Compiled Singleline IgnorePatternWhitespace RightToLeft ECMAScript CultureInvariant
それぞれの意味はこちら。
オプション | 説明 |
---|---|
IgnoreCase | 検索時に大文字と小文字を区別しないことを指定します。 |
Multiline | 複数行モードを指定します。 ^ と $ の意味を変更して、文字列全体の先頭と末尾だけでなく、任意の行の先頭と末尾にもそれぞれが一致するようにします。 |
ExplicitCapture | 明示的に名前または番号を指定された (? |
Compiled | 正規表現をコンパイルしてアセンブリを作成することを指定します。 これにより実行速度は速くなりますが、起動にかかる時間は長くなります。 |
Singleline | 単一行モードを指定します。 \n 以外の任意の文字ではなく、すべての文字と一致するようにピリオド (.) の意味を変更します。 |
IgnorePatternWhitespace | パターンからエスケープが解除された空白を削除し、# でマークされたコメントを有効にします。 ただし、IgnorePatternWhitespace 値は 文字クラス内の空白には影響しないため、文字クラスから空白が削除されることはありません。 |
RightToLeft | 検索が左から右ではなく右から左に行われるように指定します。 |
ECMAScript | 式の ECMAScript 準拠の動作を有効にします。 この値は、必ず IgnoreCase、Multiline、Compiled の各値と組み合わせて使用します。 |
CultureInvariant | 言語の違いが無視されるように指定します。 |
※RegexOptions 列挙体 (System.Text.RegularExpressions)から引用
Windowsサーバー上でもそのまま利用できるので、ログ解析なんかにも便利です。