サクラエディタGrepバッチ

##概要
本稿では、サクラエディタでのGrepを繰り返し実行するためのバッチを公開しています。
運用作業などで、ある決まった検索・置換条件のGrep作業を繰り返し実施したい場合に有用です。

※「[Grep](https://ja.wikipedia.org/wiki/Grep)」とは複数のファイルからキーワードに該当する部分を一括で抽出してくれるプログラムの事です。
正規表現を活用してGrepすると幸せになれます。
正規表現を利用した詳しい活用方法については、[**サクラエディタ正規表現Grep法**](https://qiita.com/X-IA/items/b22e3fbb3b25e93fc348)をご覧ください。

<font color=red>※本スクリプトにおける正規表現のエスケープ処理が不完全なため、処理結果に問題が無いかを一度テストしてから運用する事をオススメします。サクラエディタのマクロを必要な分だけ作成して、それらをバッチ実行した方が無難です。</font>

##環境
Windows 10, Windows 7
サクラエディタ v2.2.20以上

##使用方法
* "SakuraGrape.bat" をテキストエディタで開きます。`SET aSakura=` にてサクラエディタのプログラムファイルのパスを定義しているため、ご自身の環境に合わせて書き換え、上書き保存します。
* 一覧化対象のディレクトリパスを記述したリストファイル（CSVファイル）を、"SakuraGrape.bat" ファイルにDrag&Dropします。
* ファイルへのドロップが難しい場合は、そのまま起動するとファイルパスの入力を求められるため、リストファイルをプロンプト画面にD&Dして [Enter]キーを押下します。

###補足事項
* CSVファイルの例を同梱しましたので、参考にしてください。 
 * 1カラム目に "view" を記述するとGrep後に結果の表示のみ行い、"out" を記述するとGrep結果はテキストファイルに保存し、"rep" を記述するとGrep置換を行います。何も記述しないとエラーになります。
 * 1カラム目に "#" を含めると、その行の処理をスキップします。
* 本バッチ実行後にロックファイルとして "(CSVファイル名)+.lock" が生成されます。これを削除すると、リスト内の次の行へ処理が移らずに、頭から再度処理が始まります。
次以降の処理を変更したいけれど今の処理を中止したくない場合に便利です。
* 本バッチは、処理が成功したかを確認できるよう、下記の通りのログファイルを生成します。不要であれば削除しても差し支えありません。
 * リストファイル（CSVファイル）を1行処理する度に、ログファイル"SakuraGrape.log" に処理結果及びパラメータが出力されます。

※ "SakuraGrape" という名前は、~~花見で食べたさくらんぼとブドウに由来します~~<font color=red>「サクラエディタ」と "Grep" をモジりました</font>。

##ソースファイル
「マジック生成」するには、本ページ全体を選択してコピー後に[**B642FHT.bat**](https://qiita.com/X-IA/items/1db1929775e34ac7ef01)を起動して下さい。
その後、生成したZIPファイルを解凍して任意の場所へ配置して下さい。

興味ある方は、以下のコードをご覧ください。

###コード

```:SakuraGrapeS.bat
@ECHO OFF
COLOR 0A

REM ########### SakuraGrapeS.bat ###########
REM # Grep with Sakura Editor core process #
REM #                                      #
REM #   1st release: 2019-05-20            #
REM #   Last update: 2019-08-25            #
REM #   Author: Y. Kosaka                  #
REM #   See the web for more information   #
REM #   https://qiita.com/x-ia             #
REM ########################################
REM Command line option for Sakura Editor
REM https://sakura-editor.github.io/help/HLP000109.html
REM ########################################

SET aSakura=C:\Program\sakura\sakura.exe

SET dGrep=%2
SET fGrep=%3
SET tOpt=%4
SET tOpt=%tOpt:"=%
SET nCode=%5
SET nCode=%nCode:"=%
SET tKey=%6
SET tKey=%tKey:^^^^=^%
SET tOut=%7
SET tOut=%tOut:^^^^=^%
SET extLog=.log
SET optGrep=%1

SET dScr=%~dp0

REM SET dateNow=%date:~0,4%%date:~5,2%%date:~8,2%
REM SET timeNow=%time:~0,2%%time:~3,2%
REM SET timeNow=%timeNow: =0%
SET extSave=.txt

ECHO %optGrep% | FIND /I "r" >NUL
IF ERRORLEVEL 1 (
  ECHO %optGrep% | FIND /I "v" >NUL
  IF NOT ERRORLEVEL 1 (
    SET tOpt=%tOpt:U=%
  ) ELSE (
    SET tOpt=%tOpt:U=%U
    ECHO %tOut% | FIND /l "." >NUL
    IF ERRORLEVEL 1 SET tOut="%tOut:"=%%extSave%"
  )
)

ECHO %optGrep% | FIND /I "r" >NUL
IF NOT ERRORLEVEL 1 (
  "%aSakura%" -GREPMODE -GFOLDER=%dGrep% -GOPT=%tOpt% -GFILE=%fGrep% -GCODE=%nCode% -GKEY=%tKey% -GREPR=%tOut%>>"%dScr%%tScr%-%optGrep%%extLog%"
) ELSE (
  ECHO %optGrep% | FIND /I "v" >NUL
  IF NOT ERRORLEVEL 1 (
    START "%aSakura%" -GREPMODE -GFOLDER=%dGrep% -GOPT=%tOpt% -GFILE=%fGrep% -GCODE=%nCode% -GKEY=%tKey%
  ) ELSE (
    SET tOpt=%tOpt:U=%U
    ECHO %tOut% | FIND /I "." >NUL
    "%aSakura%" -GREPMODE -GFOLDER=%dGrep% -GOPT=%tOpt% -GFILE=%fGrep% -GCODE=%nCode% -GKEY=%tKey%>>"%dScr%%tOut:"=%"
  )
)
EXIT /B
```

```:SakuraGrape.bat
@ECHO OFF
COLOR 0B

ECHO ########### SakuraGrape.bat ############
ECHO # Grep with Sakura Editor              #
ECHO #                      iteration batch #
ECHO #                                      #
ECHO #   1st release: 2019-05-20            #
ECHO #   Last update: 2019-08-25            #
ECHO #   Author: Y. Kosaka                  #
ECHO #   See the web for more information   #
ECHO #   https://qiita.com/x-ia             #
ECHO ########################################

SET tScr=%~n0
SET fList="%1"
SET extLog=.log
SET extLock=.lock

:inFile
IF %fList% EQU "" (
  ECHO Current directory = %~dp0
  ECHO.
  ECHO ModeOption,SearchDirectory,SearchFile,GrepOption,Encoding,FindKeyword,OutputFile,ReplaceKeyword
  ECHO Enter the file includes parameters for listing up files like above.
  SET /P fList=filepath= 
) ELSE (
  ECHO Input file:
  ECHO %fList%
)

ECHO "%fList%" | FIND /I "\" >NUL
IF ERRORLEVEL 1 SET fList=%~dp0%fList%
SET fList="%fList:"=%"

COPY /Y %fList% "%fList:"=%%extLock%">NUL

:count
SET nLine=0
FOR /F "usebackq skip=1 tokens=1-2 delims=," %%a IN ("%fList:"=%%extLock%") DO (
  SET /A nLine=nLine+1
)
SET nLineMax=%nLine%
SET nLine=0


:iterate
FOR /F "usebackq skip=1 tokens=1-7 delims=," %%a IN ("%fList:"=%%extLock%") DO (
  SET /A nLine=nLine+1
  CALL TITLE %tScr% %%nLine%%/%nLineMax%

  ECHO "%%a" | FIND /I "#" >NUL
  IF NOT ERRORLEVEL 1 (
    ECHO %date% %time%	Skipped	%%a	%%b	%%c	%%d	%%e	%%f	%%g
    ECHO %date% %time%	%tScr%	Skipped	%%a	%%b	%%c	%%d	%%e	%%f	%%g>>%~dpn0%extLog%
  ) ELSE (
    CALL :callgrep  "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g"
  )
  IF NOT EXIST "%fList:"=%%extLock%" (
    ECHO Batch list has reset.
    GOTO infile
  )
  ECHO.
)

DEL "%fList:"=%%extLock%"
TIMEOUT /T 1
EXIT /B


:callgrep
    ECHO %date% %time%	Start	%1	%2	%3	%4	%5	%6	%7
    ECHO %date% %time%	%tScr%	Start	%1	%2	%3	%4	%5	%6	%7>>%~dpn0%extLog%
    CALL %~dp0%tScr%S.bat %1 %2 %3 %4 %5 %6 %7
    SET return=%ERRORLEVEL%
    IF %return% EQU 0 (
      SET return=Finish
    ) ELSE (
      SET return=Error %return%
    )
    ECHO %date% %time%	%return%	%1	%2	%3	%4	%5	%6	%7
    ECHO %date% %time%	%tScr%	%return%	%1	%2	%3	%4	%5	%6	%7>>%~dpn0%extLog%
EXIT /B
```

###バイナリ (Base64 encoding)

```
SakuraGrape.zip
---
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
---
```