暫定 - 技術メモなど

今のところはRaspberry Piを使ったIoTが話題の中心です

PowerShellを使用した文字列抽出と置換について

テキストファイルからある文字列を抽出したいことがよくあります。
通常であれば grep を使用するのがお手軽ではありますが、今回は一般ユーザー向けに手順を用意する必要があり、一般ユーザーが使用しているWindows PCには当然 grep が導入されていません。

Windowsの場合、よくある例では find が使用されます。しかし時は2018年も後半、いまどきバッチではなくPowerShellだろう、ということでPowerShellを使用しました。

今回はPowerShellを使用して文字列を抽出した際、UNIXコマンドとは違う結果になり結構手こずったので、必要となった文字列置換も含めてのメモとなります。

今回の参考サイトは下記になります。
tech.sanwasystem.com
mtgpowershell.blogspot.com
news.mynavi.jp

1.PowerShellを使った文字列抽出

PowerShellの場合、 Select-String を使用します。

Get-Content 抽出元ファイル名 | Select-String "抽出したい文字列" > 抽出先ファイル名

上記のダブルクォーテーションは念の為つけておきましょう。
(空白が含まれる場合があるので)

私の場合は時間経過ごとに抽出先ファイルを新しく作る方が有利だったので、日時分がファイル名につくように変数を使いました。

$filedate = Get-Date -Format "yyMMdd_hhmm"
Get-Content 抽出元ファイル名 | Select-String "抽出したい文字列" > $filedate-抽出先ファイル名1

当初、一般ユーザー向けに手順起こしをする前は Cygwingrep を使用していました。PowerShellでもまずまず同じような結果になったのですが、grepを使うとタブになっていた箇所が、PowerShellでは半角スペース3つに変わって出力されていました。
これは次の処理では困ったことになるので、置換についても対処しました。

2.PowerShellを使った文字列置換

前述のとおり、半角スペース3つのタブへの変換という、実に地味な変換の為、以下のようにしました。

$encoding = [Text.Encoding]::default 
$sr = new-Object IO.StreamReader((Convert-Path "$filedate-抽出先ファイル名1"),$encoding) 
$text = $sr.Readtoend()
$sr.close()
$text -replace '   ',"`t" > 抽出先ファイル名2

というわけで、最終的なスクリプトはつなげて下記のようになりました。これを拡張子 ps1 として適当なファイル名で保存すればOKです。

$filedate = Get-Date -Format "yyMMdd_hhmm"
Get-Content 抽出元ファイル名 | Select-String "抽出したい文字列" > $filedate-抽出先ファイル名1
$encoding = [Text.Encoding]::default 
$sr = new-Object IO.StreamReader((Convert-Path "$filedate-抽出先ファイル名1"),$encoding) 
$text = $sr.Readtoend()
$sr.close()
$text -replace '   ',"`t" > 抽出先ファイル名2

おしまい。