5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShellで汎用grep置換ツールを作ってみた

Last updated at Posted at 2018-05-02

##何ができるツールか

  • Sakura Editorや秀丸エディタにもついてる「grep置換」を行うツール
  • 要するに指定ディレクトリ内のファイル全ての検索語句を、指定した語句に置換する
  • 複数語句をまとめて置換可能
  • あくまで置換することが目的なので、実行ログとかは出ない

##役立つシチュエーション

  • 客先PCにSakuraは入っているけどバージョンが古くてgrep置換機能がついていなかったとき(経験談)
  • テキストエディタはメモ帳しか入っていないうえに新規プログラムのインストールが禁止されている客先PCでgrep置換する必要になったとき
  • にわかVimmerの私がgrep置換のためだけにSakuraを起動したくないと思ったとき

##ソース
変数名のセンスがない
###主処理

main.ps1
# 設定ファイルのpathと名前を宣言
$setting = ".\setting.ps1"

# 設定ファイル読み込み
.$setting

# 元フォルダを成果物フォルダへ全てコピー
Copy-Item $load -destination $save -recurse -force

# ファイル名条件に該当するファイルの一覧を作成
$obj = Get-ChildItem -path $load -include $includefilename -exclude $excludefilename -recurse -force -name

# 1ファイルずつ読み込み
foreach($wk in $obj) {
	# カウンタ初期化(置換後語句の配列参照に使用)
	$cnt = 0
	# ファイルを読み込み、内容を変数に格納
	$contents = cat ($load + $wk)
	# 置換処理開始
	# 検索語句を読み込み→対応する置換後語句へ置換→検索語句がある限り繰返し
	$before | % { 
		$contents = $contents -replace $_, $after[$cnt] 
		$cnt = $cnt + 1 
	}
	# 保存
	$contents > ($save + $wk)
}

###設定ファイル

setting.ps1
# grep置換するフォルダのパス
$load = "D:\work\"

# 置換結果の保存先
$save = "D:\after\"

# grep置換するファイルの条件(拡張子など。ワイルドカード使用可)
$includefilename = "*.bat"

# grep置換しないファイルの条件
$excludefilename = ""

# 検索語句
# @()の中に、カンマ区切りで1つ以上指定する。
# 正規表現で記述すること。
$before = @("hoge","fizz")

# 置換後の語句
# @()の中に、カンマ区切りで$beforeと同じ個数指定する。
$after = @("fuga","buzz")

###実行バッチ
(客先PCのpowershell実行ポリシーを変更するわけにもいかないのでバッチから起動する)

run.bat
@echo off
cd /d %~dp0
powershell -NoProfile -ExecutionPolicy Unrestricted .\main.ps1
pause
exit

###参考にしたサイト

5
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?