正規表現による複数の置換処理をPowerShellでまとめて実行する-実装編-

はじめに

あるシステムから出力するデータが自分の使いたい形ではない場合、Visual Studio Codeなどを使い、正規表現を使って加工する事が多いです。

ただ、中には複数回の置換を行う必要があるものがあり、一連の置換をまとめて実行できないものかと考えました。

Visual Studio Codeでは標準でマクロの機能は無いようなので、PowerShellで実装してみることにしました。*1

準備編にて、まずは「どのようなデータをどのような正規表現で加工するか」を整理しましたので、本記事では実際にスクリプトを作って行きたいと思います。

PowerShellでの連続置換を行う

まずはデータ一つで動きを確認します。

このようにしました。

$bloguser = "Takumi Funakoshi(フナコシ タクミ): 技術部"

# まず、フリガナ以降の情報を削る
$replase1 = $bloguser -replace ').*$', ''

# 姓と名を入れ替えてタブ区切りにする
$replase2 = $replase1 -replace  '^(.+) (.+)((.+)', "`$2`t`$1`t`$3"

# 置換した値を表示する
$replase2

基本的には、-replaceを使って置換するだけです。置換が必要な回数だけ変数を増やして実行する、という形にしてみました。

もう少し詳しく見てみましょう。

フリガナ以降の情報を削る

処理としてはこうなります。

$replase1 = $bloguser -replace ').*$', ''

置換のルールを箇条書きで整理します。

  • 検索文字列
    • ).*$
    • シングルクォーテーション(')で囲う
  • 置換後の文字列
    • (空白)
    • シングルクォーテーション(')で囲う

ここは、Visual Studio Codeでの置換と変わらないですね。

姓と名を入れ替えてタブ区切りにする

処理としてはこうなります。

$replase2 = $replase1 -replace  '^(.+) (.+)((.+)', "`$2`t`$1`t`$3"

置換のルールを箇条書きで整理します。

  • 検索文字列
    • ^(.+) (.+)((.+)
    • シングルクォーテーション(')で囲う
  • 置換後の文字列
    • `$2`t`$1`t`$3
    • ダブルクォーテーション(")で囲う

検索文字列は同じなのですが、置換後の指定について注意が必要です。タブが\tではなくて`tになっていたり、タブを文字として反映させるためにダブルクォーテーション(")で囲っていたり、$1などを`でエスケープしていたり、といった違いがあります。

実行結果の確認

タブの部分がちょっと分かりにくいと思いますが、ちゃんと意図したとおりに出力されました。

PS C:\> $bloguser = "Takumi Funakoshi(フナコシ タクミ): 技術部"

# まず、フリガナ以降の情報を削る
$replase1 = $bloguser -replace ').*$', ''

# 姓と名を入れ替えてタブ区切りにする
$replase2 = $replase1 -replace  '^(.+) (.+)((.+)', "`$2`t`$1`t`$3"

# 置換した値を表示する
$replase2

Funakoshi   Takumi  フナコシ タクミ

PowerShellでの連続置換を繰り返し実行する

あとは繰り返しに対応させるだけです。こうなりました。

$blogusers = Get-Content -Path "C:\work\BlogUser.txt" -Encoding UTF8

foreach($bloguser in $blogusers){
# まず、フリガナ以降の情報を削る
$replase1 = $bloguser -replace ').*$', ''
# 姓と名を入れ替えてタブ区切りにする
$replase2 = $replase1 -replace  '^(.+) (.+)((.+)', "`$2`t`$1`t`$3"
# 置換した値を表示する
$replase2
}

データは別途ファイルから読み込む形にしました。 単純に対象の文字列を貼り付けてあるだけです。

後はforeachに入れただけですね。では実行してみましょう。

PS C:\> $blogusers = Get-Content -Path "C:\work\BlogUser.txt" -Encoding UTF8

foreach($bloguser in $blogusers){
# まず、フリガナ以降の情報を削る
$replase1 = $bloguser -replace ').*$', ''
# 姓と名を入れ替えてタブ区切りにする
$replase2 = $replase1 -replace  '^(.+) (.+)((.+)', "`$2`t`$1`t`$3"
# 置換した値を表示する
$replase2
}
Funakoshi   Takumi  フナコシ タクミ
Test    User01  テスト ユーザー01
Test    User02  テスト ユーザー01

無事、欲しいデータが出力されました。

今回はコンソールに結果を表示しただけですが、別途配列に入れる、テキストに書き出す、なども出来ますね。

おわりに

これで無事、PowerShellを使って、正規表現による複数回の置換が必要な処理を一度に実行できました。

なお、PowerShellの繰り返し処理を作成するときの考え方については別記事にまとめていますので、併せて活用いただければ幸いです。

*1:拡張機能を入れれば出来るようです

執筆担当者プロフィール
舟越 匠

舟越 匠(日本ビジネスシステムズ株式会社)

人材開発部に所属。社内向けの技術研修をしつつ、JBS Tech Blog編集長を兼任。2024年8月からキーマンズネットPower Automateの連載を開始。好きなサービスはPower AutomateやLogic Apps。好きなアーティストはZABADAKとSound Horizon。

担当記事一覧