はじめに
あるシステムから出力するデータが自分の使いたい形ではない場合、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の繰り返し処理を作成するときの考え方については別記事にまとめていますので、併せて活用いただければ幸いです。
- PowewShellで一括処理をするスクリプトを考える際のステップ:前編 - JBS Tech Blog
- PowewShellで一括処理をするスクリプトを考える際のステップ:後編 - JBS Tech Blog
*1:拡張機能を入れれば出来るようです
舟越 匠(日本ビジネスシステムズ株式会社)
人材開発部に所属。社内向けの技術研修をしつつ、JBS Tech Blog編集長を兼任。2024年8月からキーマンズネットでPower Automateの連載を開始。好きなサービスはPower AutomateやLogic Apps。好きなアーティストはZABADAKとSound Horizon。
担当記事一覧