サクラエディタでGrep検索を自動化する
技術ブログをご覧いただきありがとうございます!
今回は「地味に役立つ小技集」の第一弾として
サクラエディタでGrep検索を自動化する方法をご紹介させていただきます!
はじめに
サクラエディタではGrep検索と呼ばれるものが存在します。
Grep検索とは何か・・・
指定したフォルダやファイルの範囲内で検索したい用語を洗い出す機能です。
とても便利なGrep機能ですが、非常に残念な点があります。
標準機能だと、1用語ずつのみの検索しか行えないのです!
そうなんです、ですので検索したいワードが複数存在する場合、1用語ずつGrep検索をかけるしかないんです。。。
数件程度なら問題ありませんが、大量に検索ワードが存在する場合、1件1件行うのはかなり面倒ですよね?
そこで今回はGrep検索を自動で行うバッチを作成してみましたー!!
作成手順
まずは、検索したいキーワードを1行に1つずつリスト状に書いたものを、 sakura-grep-list.txt というファイル名で保存します。
続いて、下記の内容を sakura-grep.bat などのファイル名で、先ほどと同じ場所に保存します。
検索を実行する際は、この sakura-grep.bat をダブルクリックします。
setlocal
rem ============================================================
rem Grep条件入力
rem ============================================================
rem 検索対象(対象ファイルとなるファイルの名称と拡張子を指定)
set TARGET_FILE=*.*
rem フォルダ(対象となるフォルダを指定)
set TARGET_PATH=C:\projects\〇〇
rem 除外ファイル(除外対象とするファイルを指定)
set EXCLUDED_FILE=*.exe;*.old;*.bak
rem 除外フォルダ(除外対象とするフォルダを指定)
set EXCLUDED_DIR=.git;.vs
rem ログファイル名(処理結果を出力するファイル)
set LOG_PATH=%USERPROFILE%\Desktop\sakura-grep-log.txt
rem ------------------------------------------------------------
rem 文字コード (0=SJIS, 4=UTF-8, 99=自動判別)
set CODE=99
rem 検索オプション
rem S サブフォルダからも検索
rem L 大文字と小文字を区別
rem R 正規表現
rem P 該当行を出力/未指定時は該当部分だけ出力
rem W 単語単位で探す
rem 1|2|3 結果出力形式。1か2か3のどれかを指定します。(1=ノーマル、2=ファイル毎、3=結果のみ)
rem F ファイル毎最初のみ
rem B ベースフォルダ表示
rem G フォルダ毎に表示
rem X Grep実行後カレントディレクトリを移動しない
rem C (置換)クリップボードから貼り付け (sakura:2.2.0.0以降)
rem O (置換)バックアップ作成 (sakura:2.2.0.0以降)
rem U 標準出力に出力し、Grep画面にデータを表示しない。コマンドラインからパイプやリダイレクトを指定することで結果を利用できます。(sakura:2.2.0.0以降)
rem H ヘッダ・フッタを出力しない(sakura:2.2.0.0以降)
set OPT=SPU1
rem ============================================================
rem Grep検索 準備 (コマンドラインオプション生成)
rem ============================================================
rem ファイルパターンの先頭に!を付ける(例: !*.obj)と,そのパターンに当たるファイルをGrep対象から外します。
set EXCLUDED_FILE=!%EXCLUDED_FILE:;=;!%
rem ファイルパターンの先頭に#を付ける(例: #*.svn)と、そのパターンに当たるサブフォルダをGrep対象から外します。(sakura:2.1.0.0以降)
set EXCLUDED_DIR=#%EXCLUDED_DIR:;=;#%
set TARGET=%TARGET_FILE%;%EXCLUDED_FILE%;%EXCLUDED_DIR%
%HOMEDRIVE%
cd "%ProgramFiles(x86)%\sakura"
rem ============================================================
rem Grep検索 開始
rem ============================================================
for /f %%f in (%~dp0.\sakura-grep-list.txt) do (
sakura.exe -GREPMODE -GKEY=%%f -GFILE=%TARGET% -GFOLDER=%TARGET_PATH% -GCODE=%CODE% -GOPT:%OPT% >> %LOG_PATH%
echo.>> %LOG_PATH%
echo.>> %LOG_PATH%
)
rem ============================================================
rem 終了
rem ============================================================
endlocal
pause
バッチファイルの解説
上記のバッチファイルについて、何をしているのか、詳しく説明します。
見ればわかる方は、飛ばしてください。
変数定義の準備
setlocal
バッチファイル内で変数(環境変数)を定義したい場合は、set というコマンドを使います。
しかし、この set 。設定すると他のプログラムなどにも影響を与えてしまうのです。
そこで、setlocal を書いてあげることで、バッチファイル内で定義した set コマンドはこのバッチファイル内でしか適用されなくなります。
検索対象、フォルダ、除外ファイル、除外フォルダ の指定
rem 検索対象(対象ファイルとなるファイルの名称と拡張子を指定)
set TARGET_FILE=*.*
rem フォルダ(対象となるフォルダを指定)
set TARGET_PATH=C:\projects\〇〇
rem 除外ファイル(除外対象とするファイルを指定)
set EXCLUDED_FILE=*.exe;*.old;*.bak
rem 除外フォルダ(除外対象とするフォルダを指定)
set EXCLUDED_DIR=.git;.vs
サクラエディタで実際に grep 検索するときの、ココ!
と一緒です。
ログファイル名(処理結果を出力するファイル)
set LOG_PATH=%USERPROFILE%\Desktop\sakura-grep-log.txt
この行では、grep検索した結果を出力するファイルパスを指定しています。
set EXCLUDED_FILE=!%EXCLUDED_FILE:;=;!%
set EXCLUDED_DIR=#%EXCLUDED_DIR:;=;#%
変数 EXCLUDED_FILE内の「 ; 」を「 ;! 」に置換して、先頭にも「 ! 」を付けるという文字列操作をしています。
「 !*.exe 」のように「 ! 」が付いたファイル名のパターンを指定すると、そのパターンのファイルを検索対象から除外してくれます。
(「 !*.exe 」で、ファイル名が「~.exe」で終わるファイルを無視してくれます)
バッチファイルでの文字列操作がわかりづらいと思うので、JavaScriptでの書き方と比べてみました。
同様に、変数 EXCLUDED_DIR 内の「 ; 」を「 ;# 」に置換して、先頭にも「 # 」を付けるという文字列操作をしています。
「 #.git 」のように「 # 」が付いたファイル名のパターンを指定すると、そのパターンのフォルダを検索対象から除外してくれます。
(「 #.git 」で、フォルダ名が「.git」のフォルダを無視してくれます)
検索対象、除外ファイル、除外フォルダの文字列結合
set TARGET=%TARGET_FILE%;%EXCLUDED_FILE%;%EXCLUDED_DIR%
前のコマンドで文字列操作をしたものを、; で区切って 1つに結合しています。
これも、バッチファイルでの文字列操作がわかりづらいと思うので、JavaScriptでの書き方と比べてみました。
検索オプション
rem 検索オプション
rem S サブフォルダからも検索
rem L 大文字と小文字を区別
rem R 正規表現
rem P 該当行を出力/未指定時は該当部分だけ出力
rem W 単語単位で探す
rem 1|2|3 結果出力形式。1か2か3のどれかを指定します。(1=ノーマル、2=ファイル毎、3=結果のみ)
rem F ファイル毎最初のみ
rem B ベースフォルダ表示
rem G フォルダ毎に表示
rem X Grep実行後カレントディレクトリを移動しない
rem C (置換)クリップボードから貼り付け (sakura:2.2.0.0以降)
rem O (置換)バックアップ作成 (sakura:2.2.0.0以降)
rem U 標準出力に出力し、Grep画面にデータを表示しない。コマンドラインからパイプやリダイレクトを指定することで結果を利用できます。(sakura:2.2.0.0以降)
rem H ヘッダ・フッタを出力しない(sakura:2.2.0.0以降)
set OPT=SPU1
一つ注意しないといけない点は、Uを必ず指定すること!
Uを入れていないと、検索しても結果を受け取ることができないんです。
Grep検索 開始
for /f %%f in (%~dp0.\sakura-grep-list.txt) do (
sakura.exe -GREPMODE -GKEY=%%f -GFILE=%TARGET% -GFOLDER=%TARGET_PATH% -GCODE=%CODE% -GOPT:%OPT% >> %LOG_PATH%
echo.>> %LOG_PATH%
echo.>> %LOG_PATH%
)
このバッチファイルと同じ場所に保存されている sakura-grep-list.txt というファイルを読み込んで、1行ずつ検索キーワードとして検索します。
検索結果は、LOG_PATH で指定したファイルパスへ追記していきます。
追記していく際に、見た目を整えるために、echo. というのを追記しています。
これは、改行を意味しています。
サクラエディタでの grep 実行
そしてサクラエディタをコマンドで実行して、grep を行う処理です。
サクラエディタ本体の sakura.exe を実行する際に -GREPMODE を続けて記述することで、grep 処理をコマンドから実行できます。
sakura.exe -GREPMODE -GKEY=%%f -GFILE=%TARGET% -GFOLDER=%TARGET_PATH% -GCODE=%CODE% -GOPT:%OPT% >> %LOG_PATH%
-GREPMODE
grep モードでサクラエディタを起動
-GKEY=○○
検索したいキーワードを指定
-GFILE=○○
検索対象にするファイルのパターン
-GFOLDER=○○
検索対象にするフォルダパス
-GCODE=○○
文字コード (0=SJIS, 4=UTF-8, 99=自動判別)
-GOPT:○○
検索オプション
さいごに
説明が長くなってしまいましたが、これで一括での grpe 検索が可能になります。
それではまた