OSDN Git Service

Ver8.5.2.0
[opengion/opengionV8.git] / uap / webapps / gf / src / org / opengion / fukurou / process / Process_Grep.java
index 883d4f3..941c651 100644 (file)
@@ -46,49 +46,49 @@ import java.nio.charset.CharacterCodingException;                                                           // 6.3.1.0 (2015/06/28)
 
 /**
  * Process_Grep は、上流から受け取った FileLineModelから、文字列を見つけ出す
- * ChainProcess インターフェースの実装クラスです
+ * ChainProcess インターフェースの実装クラスです
  *
- * 正規表現の keyword を上流から受け取った FileLineModel から検索します
+ * 正規表現の keyword を上流から受け取った FileLineModel から検索します
  * 見つかった対象ファイルから、指定の文字列を置換する場合は、-change か
- * -changeFile で、keyword を置換する文字列を指定して下さい
- * 置換する文字列には、\t と \n の特殊文字が使用できます
+ * -changeFile で、keyword を置換する文字列を指定して下さい
+ * 置換する文字列には、\t と \n の特殊文字が使用できます
  *
- * 処理対象は、通常は、1行づつ読み取りながら処理を行います存在チェックの場合は、
- * 見つかった時点で処理を中止しますこれは、該当箇所をピックアップするのではなく、
- * 存在しているかどうかを判断して、あれば、下流に流すというのが目的だからです
- * keyword を、改行を含む正規表現で、検索置換する場合は、-useBulkRead 属性を
- * true に設定してください。これは、入力ファイルを一括して読み込みます。
- * -ignoreCase は、検索時にキーの大文字小文字を無視するように指定します
- * -notEquals は、結果(見つかればtrue)を反転(見つからなければtrue)します
+ * 処理対象は、通常は、1行づつ読み取りながら処理を行います存在チェックの場合は、
+ * 見つかった時点で処理を中止しますこれは、該当箇所をピックアップするのではなく、
+ * 存在しているかどうかを判断して、あれば、下流に流すというのが目的だからです
+ * keyword を、改行を含む正規表現で、検索置換する場合は、-useBulkRead 属性を
+ * true に設定してください。これは、入力ファイルを一括して読み込みます。
+ * -ignoreCase は、検索時にキーの大文字小文字を無視するように指定します
+ * -notEquals は、結果(見つかればtrue)を反転(見つからなければtrue)します
  * これは、行単位ではなく、ファイル単位に判定しますので、change 指定した場合
- * でも、対象行は、見つかった行ですただし、下流に対して、見つからない
- * 場合だけ処理を継続させます
- * -inEncode は、入力ファイルのエンコード指定になります
+ * でも、対象行は、見つかった行ですただし、下流に対して、見つからない
+ * 場合だけ処理を継続させます
+ * -inEncode は、入力ファイルのエンコード指定になります
  * -outEncode は、出力ファイルのエンコードや、changeFileで指定の置換文字列ファイルの
- * エンコード指定になります。(changeFile は、必ず 出力ファイルと同じエンコードです。)
+ * エンコード指定になります。(changeFile は、必ず 出力ファイルと同じエンコードです。)
  * これらのエンコードが無指定の場合は、System.getProperty("file.encoding") で
- * 求まる値を使用します
- * -changeFile を使用することで、複数行の文字列に置換することが可能です
- * -outfile では、処理を行ったファイル名一覧をセーブします
+ * 求まる値を使用します
+ * -changeFile を使用することで、複数行の文字列に置換することが可能です
+ * -outfile では、処理を行ったファイル名一覧をセーブします
  *
- * 上流(プロセスチェインのデータは上流から渡されます)からのLineModel の
- * ファイルオブジェクトより、指定の文字列が含まれているか検索します
+ * 上流(プロセスチェインのデータは上流から渡されます)からのLineModel の
+ * ファイルオブジェクトより、指定の文字列が含まれているか検索します
  * 上流プロセスでは、Name 属性として、『File』を持ち、値は、Fileオブジェクト
- * である、Process_FileSearch を使用するのが、便利ですそれ以外のクラスを
+ * である、Process_FileSearch を使用するのが、便利ですそれ以外のクラスを
  * 使用する場合でも、Name属性と、File オブジェクトを持つ LineModel を受け渡し
- * できれば、使用可能です
+ * できれば、使用可能です
  *
  * ※ 6.3.1.1 (2015/07/10) useOmitCmnt、useAllFind 機能追加
  *
- * 引数文字列中に空白を含む場合は、ダブルコーテーション("") で括って下さい
- * 引数文字列の 『=』の前後には、空白は挟めません必ず、-key=value の様に
- * 繋げてください
+ * 引数文字列中に空白を含む場合は、ダブルコーテーション("") で括って下さい
+ * 引数文字列の 『=』の前後には、空白は挟めません必ず、-key=value の様に
+ * 繋げてください
  *
  * ※ 8.1.3.0 (2022/06/03) jarPrefix、jarSuffix、jarInstr、useRegexp、saveFile 追加
- *    jar ファイルの中身も検索しますその際、jarファイルに圧縮されているファイル名での
- *    絞り込みができるように、指定できる属性を追加します
- *    ただし、jarファイル内の検索は、useAllFind=true(置換ではなく検索だけ最後まで行う)のみです
- *    上流から jar ファイルが指定された場合は、常に検索対象になります
+ *    jar ファイルの中身も検索しますその際、jarファイルに圧縮されているファイル名での
+ *    絞り込みができるように、指定できる属性を追加します
+ *    ただし、jarファイル内の検索は、useAllFind=true(置換ではなく検索だけ最後まで行う)のみです
+ *    上流から jar ファイルが指定された場合は、常に検索対象になります
  *
  * @og.formSample
  *  Process_Grep -keyword=検索文字列 -ignoreCase=true -outfile=OUTFILE -encode=UTF-8
@@ -98,13 +98,13 @@ import java.nio.charset.CharacterCodingException;                                                           // 6.3.1.0 (2015/06/28)
  *   [-notEquals=判定結果の反転] :判定結果を反転させる(true)かどうか(初期値:反転させない[false])
  *   [-inEncode=入力エンコード     ] :入力ファイルのエンコードタイプ
  *   [-outEncode=出力エンコード    ] :出力ファイルや置換ファイルのエンコードタイプ
- *   [-change=置換文字列       ] :-change="ABCD" \t や \n などの特殊文字が使用できます
- *   [-changeFile=置換ファイル     ] :-changeFile=change.txt このファイルの記述すべてと置換します
- *                                     -change と、-changeFile は、同時に指定できません
- *                                     置換機能使用時は、必ず、_backup というファイルが作成されます
+ *   [-change=置換文字列       ] :-change="ABCD" \t や \n などの特殊文字が使用できます
+ *   [-changeFile=置換ファイル     ] :-changeFile=change.txt このファイルの記述すべてと置換します
+ *                                     -change と、-changeFile は、同時に指定できません
+ *                                     置換機能使用時は、必ず、_backup というファイルが作成されます
  *   [-insert=[HEAD/CHANGE/BEFORE/AFTER/TAIL]   ]
  *                               : 置換でなく挿入する場合の位置を指定します(初期値:CHANGE)
- *                                 スペースで区切って数字を記述すると、挿入位置にオフセットできます
+ *                                 スペースで区切って数字を記述すると、挿入位置にオフセットできます
  *   [-delete=[false/true]     ] : 置換でなく削除します(初期値:false)
  *   [-skipRowCount=スキップ行数  ] : 先頭行から、スキップする行数を指定します(useBulkRead時には使用されません)
  *   [-useBackup=[false/true]  ] :trueは、backupファイルを作成します(初期値:false)
@@ -169,9 +169,9 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        private PrintWriter             outWriter;                                                                                      // 8.1.3.0 (2022/06/03) PrintWriterオブジェクト
        private final String    fileURL = HybsSystem.sys( "FILE_URL" );                         // 8.1.3.0 (2022/06/03) ファイルURL
 
-       /** staticイニシャライザ後、読み取り専用にするので、ConcurrentHashMap を使用しません */
+       /** staticイニシャライザ後、読み取り専用にするので、ConcurrentHashMap を使用しません */
        private static final Map<String,String> MUST_PROPARTY   ;               // [プロパティ]必須チェック用 Map
-       /** staticイニシャライザ後、読み取り専用にするので、ConcurrentHashMap を使用しません */
+       /** staticイニシャライザ後、読み取り専用にするので、ConcurrentHashMap を使用しません */
        private static final Map<String,String> USABLE_PROPARTY ;               // [プロパティ]整合性チェック Map
 
        static {
@@ -179,20 +179,20 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                MUST_PROPARTY.put( "keyword",   "検索する語句(必須)" );
 
                USABLE_PROPARTY = new LinkedHashMap<>();
-               USABLE_PROPARTY.put( "ignoreCase",      "検索時に大文字小文字を区別しない(true)かどうか" +
+               USABLE_PROPARTY.put( "ignoreCase",      "検索時に大文字小文字を区別しない(true)かどうか" +
                                                                                CR + "(初期値:区別する[false])" );
-               USABLE_PROPARTY.put( "notEquals",       "検索時に判定結果を反転させる(true)かどうか" +
+               USABLE_PROPARTY.put( "notEquals",       "検索時に判定結果を反転させる(true)かどうか" +
                                                                                CR + "(初期値:反転させない[false])" );
                USABLE_PROPARTY.put( "inEncode",        "入力ファイルのエンコードタイプ" );
                USABLE_PROPARTY.put( "outEncode",       "出力ファイルや置換ファイルのエンコードタイプ" );
-               USABLE_PROPARTY.put( "change",          "置換文字列 例: -change=\"ABCD\" \\t や \\n などの特殊文字が使用できます" );
+               USABLE_PROPARTY.put( "change",          "置換文字列 例: -change=\"ABCD\" \\t や \\n などの特殊文字が使用できます" );
                USABLE_PROPARTY.put( "changeFile",      "置換文字列ファイル 例: -changeFile=change.txt" +
-                                                                               CR + "-change と、-changeFile は、同時に指定できません" +
-                                                                               CR + "置換機能使用時は、必ず、_backup というファイルが作成されます" );
+                                                                               CR + "-change と、-changeFile は、同時に指定できません" +
+                                                                               CR + "置換機能使用時は、必ず、_backup というファイルが作成されます" );
                USABLE_PROPARTY.put( "insert",          "[HEAD/CHANGE/BEFORE/AFTER/TAIL]:置換でなく挿入する場合の位置を指定します(初期値:CHANGE)"  +
-                                                                               CR + "スペースで区切って数字を記述すると、挿入位置にオフセットできます" );
+                                                                               CR + "スペースで区切って数字を記述すると、挿入位置にオフセットできます" );
                USABLE_PROPARTY.put( "delete",          "[false/true]:trueは、置換でなく削除します(初期値:false)" );
-               USABLE_PROPARTY.put( "skipRowCount","先頭行から、スキップする行数を指定します" );                                                                     // 6.2.4.0 (2015/05/15)
+               USABLE_PROPARTY.put( "skipRowCount","先頭行から、スキップする行数を指定します" );                                                                     // 6.2.4.0 (2015/05/15)
                USABLE_PROPARTY.put( "useBackup",       "[false/true]:trueは、backupファイルを作成します(初期値:false)" );
                USABLE_PROPARTY.put( "useBulkRead",     "[false/true]:trueは、入力ファイルを一括読込します(初期値:false)" );
                USABLE_PROPARTY.put( "useAllFind",      "置換ではなく検索だけ最後まで行う場合、trueを指定します(初期値:false)" );   // 6.3.1.1 (2015/07/10)
@@ -210,9 +210,9 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * デフォルトコンストラクター
-        * このクラスは、動的作成されますデフォルトコンストラクターで、
-        * super クラスに対して、必要な初期化を行っておきます
+        * デフォルトコンストラクター
+        * このクラスは、動的作成されますデフォルトコンストラクターで、
+        * super クラスに対して、必要な初期化を行っておきます
         *
         */
        public Process_Grep() {
@@ -220,10 +220,10 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * プロセスの初期化を行います。初めに一度だけ、呼び出されます。
-        * 初期処理(ファイルオープン、DBオープン等)に使用します。
+        * プロセスの初期化を行います。初めに一度だけ、呼び出されます。
+        * 初期処理(ファイルオープン、DBオープン等)に使用します。
         *
-        * @og.rev 6.3.1.0 (2015/06/28) errAbend属性追加
+        * @og.rev 6.3.1.0 (2015/06/28) errAbend属性追加
         * @og.rev 6.3.1.1 (2015/07/10) useOmitCmnt、useAllFind 機能追加
         * @og.rev 8.1.3.0 (2022/06/03) jarファイル内の検索、オートエンコード対応
         *
@@ -270,7 +270,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                        if( !isOK ) {
                                // 実行時エラーではないので、errAbend 対象外
                                final String errMsg = "insert は、" + Arrays.toString( INSERT_LIST )
-                                                                       + " から指定してください" + CR
+                                                                       + " から指定してください" + CR
                                                                        + "-insert=[" + insert + "]" ;
                                throw new OgRuntimeException( errMsg );
                        }
@@ -279,7 +279,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                        change = StringUtil.replace( change,"\\t","\t" );
                }
 
-               if( delete ) { change = ""; }   // 削除は、"" 文字列と置換します
+               if( delete ) { change = ""; }   // 削除は、"" 文字列と置換します
 
                // 8.1.3.0 (2022/06/03) Modify
 //             if( ignoreCase ) {
@@ -311,8 +311,8 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * プロセスの終了を行います。最後に一度だけ、呼び出されます。
-        * 終了処理(ファイルクローズ、DBクローズ等)に使用します
+        * プロセスの終了を行います。最後に一度だけ、呼び出されます。
+        * 終了処理(ファイルクローズ、DBクローズ等)に使用します
         *
         * @og.rev 8.1.3.0 (2022/06/03) jarファイル内の検索、オートエンコード対応
         *
@@ -326,19 +326,19 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * 引数の LineModel を処理するメソッドです
-        * 変換処理後の LineModel を返します
+        * 引数の LineModel を処理するメソッドです
+        * 変換処理後の LineModel を返します
         * 後続処理を行わない場合(データのフィルタリングを行う場合)は、
-        * null データを返しますつまり、null データは、後続処理を行わない
-        * フラグの代わりにも使用しています
+        * null データを返しますつまり、null データは、後続処理を行わない
+        * フラグの代わりにも使用しています
         * なお、変換処理後の LineModel と、オリジナルの LineModel が、
-        * 同一か、コピー(クローン)かは、各処理メソッド内で決めています
+        * 同一か、コピー(クローン)かは、各処理メソッド内で決めています
         * ドキュメントに明記されていない場合は、副作用が問題になる場合は、
-        * 各処理ごとに自分でコピー(クローン)して下さい
+        * 各処理ごとに自分でコピー(クローン)して下さい
         *
-        * @og.rev 4.0.1.0 (2007/12/14) ファイルの一括処理対応
-        * @og.rev 5.7.2.2 (2014/01/24) エラー時にデータも出力します
-        * @og.rev 6.3.1.0 (2015/06/28) errAbend属性追加
+        * @og.rev 4.0.1.0 (2007/12/14) ファイルの一括処理対応
+        * @og.rev 5.7.2.2 (2014/01/24) エラー時にデータも出力します
+        * @og.rev 6.3.1.0 (2015/06/28) errAbend属性追加
         * @og.rev 8.1.3.0 (2022/06/03) jarファイル内の検索、オートエンコード対応
         *
         * @param       data    オリジナルのLineModel
@@ -355,7 +355,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                }
                else {
                        // これは、プログラマーの問題なので、errAbend 対象外
-                       final String errMsg = "データが FileLineModel オブジェクトではありません。" + CR ;
+                       final String errMsg = "データが FileLineModel オブジェクトではありません。" + CR ;
                        throw new OgRuntimeException( errMsg );
                }
 
@@ -388,21 +388,21 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
 
                        // 置換処理 ただし、見つかったときのみ実行
                        if( change != null && isFind ) {
-                               // 入力ファイルは、オリジナル_backup ファイルとする過去のファイルを削除
+                               // 入力ファイルは、オリジナル_backup ファイルとする過去のファイルを削除
                                final File inFile = new File( file.getPath() + "_backup" );
                                if( inFile.exists() && !inFile.delete() ) {
-                                       final String errMsg = "過去のBKUPファイルを削除できませんでした。[" + inFile + "]" + CR
-                                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
-                                       // try の中から throw するのは、行儀がよくないが、catch ブロックで errAbend処理する
+                                       final String errMsg = "過去のBKUPファイルを削除できませんでした。[" + inFile + "]" + CR
+                                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
+                                       // try の中から throw するのは、行儀がよくないが、catch ブロックで errAbend処理する
                                        throw new OgRuntimeException( errMsg );
                                }
 
-                               // オリジナルのファイルを、_backup ファイル名に先に変換する
+                               // オリジナルのファイルを、_backup ファイル名に先に変換する
                                final File fromFile = new File( file.getPath() );
                                if( !fromFile.renameTo( inFile ) ) {
-                                       final String errMsg = "所定のファイルをリネームできませんでした。[" + fromFile + "]" + CR
-                                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
-                                       // try の中から throw するのは、行儀がよくないが、catch ブロックで errAbend処理する
+                                       final String errMsg = "所定のファイルをリネームできませんでした。[" + fromFile + "]" + CR
+                                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
+                                       // try の中から throw するのは、行儀がよくないが、catch ブロックで errAbend処理する
                                        throw new OgRuntimeException( errMsg );
                                }
 
@@ -411,20 +411,20 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
 //                             else                      { changeKeyword( inFile,file,firstLineNo ); }
                                else                      { changeKeyword( inFile,file,firstLineNo,mapEnc ); }  // 8.1.3.0 (2022/06/03)
 
-                               // backup を使わない場合は、削除する
+                               // backup を使わない場合は、削除する
                                // 4.0.0.0 (2007/11/29) 入れ子if の統合
                                if( !useBackup && !inFile.delete() ) {
-                                       final String errMsg = "所定のファイルを削除できませんでした。[" + inFile + "]" + CR
-                                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
-                                       // try の中から throw するのは、行儀がよくないが、catch ブロックで errAbend処理する
+                                       final String errMsg = "所定のファイルを削除できませんでした。[" + inFile + "]" + CR
+                                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
+                                       // try の中から throw するのは、行儀がよくないが、catch ブロックで errAbend処理する
                                        throw new OgRuntimeException( errMsg );
                                }
                        }
                }
                catch( final RuntimeException ex ) {
-                       final String errMsg = "処理中にエラーが発生しました。[" + data.getRowNo() + "]件目" + CR
-                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
-                       // 6.3.1.0 (2015/06/28) errAbend属性追加
+                       final String errMsg = "処理中にエラーが発生しました。[" + data.getRowNo() + "]件目" + CR
+                                               +       "data=[" + data.dataLine() + "]" + CR ;         // 5.7.2.2 (2014/01/24) エラー時にデータも出力します
+                       // 6.3.1.0 (2015/06/28) errAbend属性追加
                        throwException( errMsg,ex,errAbend );
                }
 
@@ -434,10 +434,11 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * キーワードが存在しているかどうかをチェックします
+        * キーワードが存在しているかどうかをチェックします
         * ここでは、1行づつ読み取りながら、すべてのキーワードをピックアップします。
         *
         * @og.rev 8.1.3.0 (2022/06/03) jarファイル内の検索、オートエンコード対応
+        * @og.rev 8.5.2.0 (2023/07/14) -change=置換文字列 の指定がなくても findCount がセットされるように対応
         *
         * @param       file    検索元のファイルオブジェクト
         */
@@ -492,6 +493,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                                                                        }
                                                                        // useAllFind=true 相当の処理のみ行う
                                                                        println( msg );
+                                                                       findCount++ ;                                                           // 8.5.2.0 (2023/07/14) Add
                                                                        // 保存ファイル指定有り
                                                                        if( StringUtil.isNotNull(saveFile) ){ outWriter.println( msg ); }
 
@@ -502,14 +504,14 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                                                }
                                                // nioを使用すると UTF-8とShuft-JISで、エラーになる
                                                catch( final CharacterCodingException ex ) {
-                                                       final String errMsg = "文字のエンコード・エラーが発生しました。" + CR
-                                                                                               +       "  ファイルのエンコードが指定のエンコードと異なります。" + CR
+                                                       final String errMsg = "文字のエンコード・エラーが発生しました。" + CR
+                                                                                               +       "  ファイルのエンコードが指定のエンコードと異なります。" + CR
                                                                                                +       " [" + file.getPath() + "] , Encode=[" + mapEnc + "]" ;
                                                        // 呼出元で errAbend 処理するので、そのまま throw しておく
                                                        throw new OgCharacterException( errMsg,ex );
                                                }
                                                catch( final IOException ex ) {
-                                                       final String errMsg = "キーワードファイル読取エラーが発生しました。" + CR
+                                                       final String errMsg = "キーワードファイル読取エラーが発生しました。" + CR
                                                                                                +       " [" + file.getPath() + "] , Encode=[" + mapEnc + "]" ;
                                                        // 呼出元で errAbend 処理するので、そのまま throw しておく
                                                        throw new OgRuntimeException( errMsg,ex );
@@ -525,7 +527,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                        }
                }
                catch( final IOException ex ) {
-                       final String errMsg = "キーワードファイル読取エラーが発生しました。" + CR
+                       final String errMsg = "キーワードファイル読取エラーが発生しました。" + CR
                                                                +       " [" + file.getPath() + "] , Encode=[" + inEncode + "]" ;
                        // 呼出元で errAbend 処理するので、そのまま throw しておく
                        throw new OgRuntimeException( errMsg,ex );
@@ -594,18 +596,19 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * キーワードが存在しているかどうかをチェックします
-        * ここでは、1行づつ読み取りながら、最初に見つかった時点で制御を返します
+        * キーワードが存在しているかどうかをチェックします
+        * ここでは、1行づつ読み取りながら、最初に見つかった時点で制御を返します
         * よって、複数行にまたがる keyword でのマッチングは出来ませんが、大きな
-        * ファイル等での検索には、効率的です
+        * ファイル等での検索には、効率的です
         *
         * @og.rev 4.0.1.0 (2007/12/14) 新規追加
-        * @og.rev 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
-        * @og.rev 6.3.1.0 (2015/06/28) errAbend属性追加
+        * @og.rev 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
+        * @og.rev 6.3.1.0 (2015/06/28) errAbend属性追加
         * @og.rev 6.3.1.1 (2015/07/10) useOmitCmnt、useAllFind 機能追加
-        * @og.rev 6.4.0.2 (2015/12/11) CommentLineParser 改造
-        * @og.rev 6.5.0.1 (2016/10/21) CharacterCodingException は、OgCharacterException に変換する
+        * @og.rev 6.4.0.2 (2015/12/11) CommentLineParser 改造
+        * @og.rev 6.5.0.1 (2016/10/21) CharacterCodingException は、OgCharacterException に変換する
         * @og.rev 8.1.3.0 (2022/06/03) jarファイル内の検索、オートエンコード対応
+        * @og.rev 8.5.2.0 (2023/07/14) -change=置換文字列 の指定がなくても findCount がセットされるように対応
         *
         * @param       file    検索元のファイルオブジェクト
         * @param       mapEnc  検索元のファイルエンコード
@@ -624,9 +627,9 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                        String line ;
                        int lineNo = 0;
                        while((line = reader.readLine()) != null) {
-                               lineNo++ ;              // 注意:ここで返す行数は、コメント行を含む行数とする
+                               lineNo++ ;              // 注意:ここで返す行数は、コメント行を含む行数とする
 
-                               // 6.3.1.1 (2015/07/10) useOmitCmnt 機能。コメント行を削除する処理を入れる。
+                               // 6.3.1.1 (2015/07/10) useOmitCmnt 機能。コメント行を削除する処理を入れる。
                                if( useOmitCmnt ) {
                                        line = clp.line( line );
                                        if( line == null ) { continue; }        // 戻り値が null の場合は、行として不成立
@@ -641,10 +644,11 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                                                println( buf );
                                        }
 
-                                       // 6.3.1.1 (2015/07/10) useAllFind 機能。最後まで検索を続けます。
+                                       // 6.3.1.1 (2015/07/10) useAllFind 機能。最後まで検索を続けます。
                                        if( useAllFind ) {
                                                final String msg = file.getAbsolutePath() + '(' + lineNo + "):" + line ;
                                                println( msg );
+                                               findCount++ ;                                                                                   // 8.5.2.0 (2023/07/14) Add
                                                // 8.1.3.0 (2022/06/03) 保存ファイル指定有り
                                                if( StringUtil.isNotNull(saveFile) ){ outWriter.println( msg ); }
                                        }
@@ -655,20 +659,20 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                                }
                        }
                }
-               // 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
+               // 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
                catch( final CharacterCodingException ex ) {
-                       final String errMsg = "文字のエンコード・エラーが発生しました。" + CR
-                                                               +       "  ファイルのエンコードが指定のエンコードと異なります。" + CR
+                       final String errMsg = "文字のエンコード・エラーが発生しました。" + CR
+                                                               +       "  ファイルのエンコードが指定のエンコードと異なります。" + CR
 //                                                             +       " [" + file.getPath() + "] , Encode=[" + inEncode + "]" ;
                                                                +       " [" + file.getPath() + "] , Encode=[" + mapEnc + "]" ; // 8.1.3.0 (2022/06/03)
-                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
+                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
                        throw new OgCharacterException( errMsg,ex );    // 6.5.0.1 (2016/10/21)
                }
                catch( final IOException ex ) {
-                       final String errMsg = "キーワードファイル読取エラーが発生しました。" + CR
+                       final String errMsg = "キーワードファイル読取エラーが発生しました。" + CR
 //                                                             +       " [" + file.getPath() + "] , Encode=[" + inEncode + "]" ;
                                                                +       " [" + file.getPath() + "] , Encode=[" + mapEnc + "]" ; // 8.1.3.0 (2022/06/03)
-                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
+                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
                        throw new OgRuntimeException( errMsg,ex );
                }
                finally {
@@ -679,14 +683,15 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * キーワードが存在しているかどうかをチェックします
-        * ここでは、ファイルをすべて読み取ってから、チェックします
-        * よって、複数行にまたがる keyword でのマッチングが可能です
+        * キーワードが存在しているかどうかをチェックします
+        * ここでは、ファイルをすべて読み取ってから、チェックします
+        * よって、複数行にまたがる keyword でのマッチングが可能です
         *
         * @og.rev 4.0.1.0 (2007/12/14) 新規追加
         * @og.rev 6.4.5.1 (2016/04/28) FileStringのコンストラクター変更
-        * @og.rev 6.4.5.2 (2016/05/06) fukurou.util.FileString から、fukurou.util.FileUtil に移動
+        * @og.rev 6.4.5.2 (2016/05/06) fukurou.util.FileString から、fukurou.util.FileUtil に移動
         * @og.rev 8.1.3.0 (2022/06/03) jarファイル内の検索、オートエンコード対応
+        * @og.rev 8.5.2.0 (2023/07/14) -change=置換文字列 の指定がなくても findCount がセットされるように対応
         *
         * @param       file    検索元のファイルオブジェクト
         * @param       mapEnc  検索元のファイルエンコード
@@ -705,6 +710,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                final Matcher mach = pattern.matcher( line );
                if( mach.find() ) {
                        if( debug ) { println( "DEBUG:\t" + file.getPath() ); }
+                       findCount++ ;                                                                                                           // 8.5.2.0 (2023/07/14) Add
                        isFind = true;
                }
 
@@ -712,17 +718,17 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * キーワードを指定の文字列に置き換えます
+        * キーワードを指定の文字列に置き換えます
         * useBackup 属性に true を指定した場合、置き換え後の、backup ファイルは、
-        * オリジナル_backup という名称に変わります
-        * ここでは、1行づつ読み取りながら、変換処理を行います
+        * オリジナル_backup という名称に変わります
+        * ここでは、1行づつ読み取りながら、変換処理を行います
         * よって、複数行にまたがる keyword でのマッチングは出来ませんが、大きな
-        * ファイル等での置換でも、メモリの使用量は抑えられます
+        * ファイル等での置換でも、メモリの使用量は抑えられます
         *
-        * @og.rev 4.0.1.0 (2007/12/14) 置換処理を独立させます
+        * @og.rev 4.0.1.0 (2007/12/14) 置換処理を独立させます
         * @og.rev 6.2.4.0 (2015/05/15) HEAD,TAIL 追加
-        * @og.rev 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
-        * @og.rev 6.5.0.1 (2016/10/21) CharacterCodingException は、OgCharacterException に変換する
+        * @og.rev 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
+        * @og.rev 6.5.0.1 (2016/10/21) CharacterCodingException は、OgCharacterException に変換する
         * @og.rev 8.1.3.0 (2022/06/03) jarファイル内の検索、オートエンコード対応
         *
         * @param       inFile  検索元の入力ファイルオブジェクト
@@ -768,7 +774,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                                                cngCount++ ;    // 変換されれば カウント
                                        }
                                }
-                               writer.println( line ); // readLine() してるので、最後に改行が必要
+                               writer.println( line ); // readLine() してるので、最後に改行が必要
                        }
 
                        // 6.2.4.0 (2015/05/15) HEAD,TAIL 追加
@@ -776,20 +782,20 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                                writer.println( change );
                        }
                }
-               // 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
+               // 6.3.1.0 (2015/06/28) nioを使用すると UTF-8とShuft-JISで、エラーになる
                catch( final CharacterCodingException ex ) {
-                       final String errMsg = "文字のエンコード・エラーが発生しました。" + CR
-                                                               +       "  ファイルのエンコードが指定のエンコードと異なります。" + CR
+                       final String errMsg = "文字のエンコード・エラーが発生しました。" + CR
+                                                               +       "  ファイルのエンコードが指定のエンコードと異なります。" + CR
 //                                                             +       " [" + inFile + "] , Encode=[" + inEncode + "]" ;
                                                                +       " [" + inFile + "] , Encode=[" + mapEnc + "]" ; // 8.1.3.0 (2022/06/03)
-                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
+                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
                        throw new OgCharacterException( errMsg,ex );    // 6.5.0.1 (2016/10/21)
                }
                catch( final IOException ex ) {
-                       final String errMsg = "処理中にエラーが発生しました。[" + line + "]" + CR
+                       final String errMsg = "処理中にエラーが発生しました。[" + line + "]" + CR
 //                                                             +       " [" + inFile + "] , Encode=[" + inEncode + "]" ;
                                                                +       " [" + inFile + "] , Encode=[" + mapEnc + "]" ; // 8.1.3.0 (2022/06/03)
-                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
+                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
                        throw new OgRuntimeException( errMsg,ex );
                }
                finally {
@@ -798,13 +804,13 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                }
        }
        /**
-        * キーワードを指定の文字列に置き換えます
+        * キーワードを指定の文字列に置き換えます
         * useBackup 属性に true を指定した場合、置き換え後の、backup ファイルは、
-        * オリジナル_backup という名称に変わります
-        * ここでは、ファイルをすべて読み取ってから、チェックします
-        * よって、複数行にまたがる keyword でのマッチングが可能です
+        * オリジナル_backup という名称に変わります
+        * ここでは、ファイルをすべて読み取ってから、チェックします
+        * よって、複数行にまたがる keyword でのマッチングが可能です
         *
-        * @og.rev 4.0.1.0 (2007/12/14) 置換処理を独立させます
+        * @og.rev 4.0.1.0 (2007/12/14) 置換処理を独立させます
         * @og.rev 6.2.4.0 (2015/05/15) HEAD,TAIL 追加
         *
         * @param       fileLine        検索元の行文字列
@@ -846,8 +852,8 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
                        }
                }
                catch( final RuntimeException ex ) {
-                       final String errMsg = "処理中にエラーが発生しました。[" + outFile.getPath() + "]" ;
-                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
+                       final String errMsg = "処理中にエラーが発生しました。[" + outFile.getPath() + "]" ;
+                       // 呼出元で、errAbend処理するので、そのまま、throw しておく
                        throw new OgRuntimeException( errMsg,ex );
                }
                finally {
@@ -856,9 +862,9 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * insert が、"CHANGE" の場合の処理結果を求めます
-        * 変換しなかった場合は、null を返します
-        * これは、変換カウントを算出する為のフラグ代わりに使用しています
+        * insert が、"CHANGE" の場合の処理結果を求めます
+        * 変換しなかった場合は、null を返します
+        * これは、変換カウントを算出する為のフラグ代わりに使用しています
         *
         * @param       mach    キーワードの正規表現
         *
@@ -873,9 +879,9 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * insert が、"BEFORE" の場合の処理結果を求めます
-        * 変換しなかった場合は、null を返します
-        * これは、変換カウントを算出する為のフラグ代わりに使用しています
+        * insert が、"BEFORE" の場合の処理結果を求めます
+        * 変換しなかった場合は、null を返します
+        * これは、変換カウントを算出する為のフラグ代わりに使用しています
         *
         * @param       line    検索行
         * @param       mach    キーワードの正規表現
@@ -904,9 +910,9 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * insert が、"AFTER" の場合の処理結果を求めます
-        * 変換しなかった場合は、null を返します
-        * これは、変換カウントを算出する為のフラグ代わりに使用しています
+        * insert が、"AFTER" の場合の処理結果を求めます
+        * 変換しなかった場合は、null を返します
+        * これは、変換カウントを算出する為のフラグ代わりに使用しています
         *
         * @param       line    検索行
         * @param       mach    キーワードの正規表現
@@ -934,10 +940,10 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * プロセスの処理結果のレポート表現を返します
-        * 処理プログラム名、入力件数、出力件数などの情報です
+        * プロセスの処理結果のレポート表現を返します
+        * 処理プログラム名、入力件数、出力件数などの情報です
         * この文字列をそのまま、標準出力に出すことで、結果レポートと出来るような
-        * 形式で出してください
+        * 形式で出してください
         *
         * @return   処理結果のレポート
         */
@@ -956,7 +962,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * このクラスの使用方法を返します
+        * このクラスの使用方法を返します
         *
         * @return      このクラスの使用方法
         * @og.rtnNotNull
@@ -964,41 +970,41 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        public String usage() {
                final StringBuilder buf = new StringBuilder( 1400 )
                        .append( "Process_Grep は、上流から受け取った FileLineModelから、文字列を見つけ出す"     ).append( CR )
-                       .append( "ChainProcess インターフェースの実装クラスです"                                                                                     ).append( CR )
+                       .append( "ChainProcess インターフェースの実装クラスです"                                                                                     ).append( CR )
                        .append( CR )
-                       .append( "正規表現の keyword を上流から受け取った FileLineModel から検索します"                ).append( CR )
+                       .append( "正規表現の keyword を上流から受け取った FileLineModel から検索します"                ).append( CR )
                        .append( "見つかった対象ファイルから、指定の文字列を置換する場合は、-change か"                           ).append( CR )
-                       .append( "-changeFile で、keyword を置換する文字列を指定して下さい"                                        ).append( CR )
-                       .append( "置換する文字列には、\t と \n の特殊文字が使用できます"                                              ).append( CR )
+                       .append( "-changeFile で、keyword を置換する文字列を指定して下さい"                                        ).append( CR )
+                       .append( "置換する文字列には、\t と \n の特殊文字が使用できます"                                              ).append( CR )
                        .append( CR )
-                       .append( "処理対象は、通常は、1行づつ読み取りながら処理を行います存在チェックの場合は、"     ).append( CR )
-                       .append( "見つかった時点で処理を中止しますこれは、該当箇所をピックアップするのではなく、"       ).append( CR )
-                       .append( "存在しているかどうかを判断して、あれば、下流に流すというのが目的だからです"   ).append( CR )
-                       .append( "keyword を、改行を含む正規表現で、検索置換する場合は、-useBulkRead 属性を"       ).append( CR )
-                       .append( "true に設定してください。これは、入力ファイルを一括して読み込みます。"                                ).append( CR )
-                       .append( "-ignoreCase は、検索時にキーの大文字小文字を無視するように指定します"                  ).append( CR )
-                       .append( "-notEquals は、結果(見つかればtrue)を反転(見つからなければtrue)します"              ).append( CR )
+                       .append( "処理対象は、通常は、1行づつ読み取りながら処理を行います存在チェックの場合は、"     ).append( CR )
+                       .append( "見つかった時点で処理を中止しますこれは、該当箇所をピックアップするのではなく、"       ).append( CR )
+                       .append( "存在しているかどうかを判断して、あれば、下流に流すというのが目的だからです"   ).append( CR )
+                       .append( "keyword を、改行を含む正規表現で、検索置換する場合は、-useBulkRead 属性を"       ).append( CR )
+                       .append( "true に設定してください。これは、入力ファイルを一括して読み込みます。"                        ).append( CR )
+                       .append( "-ignoreCase は、検索時にキーの大文字小文字を無視するように指定します"                  ).append( CR )
+                       .append( "-notEquals は、結果(見つかればtrue)を反転(見つからなければtrue)します"              ).append( CR )
                        .append( "これは、行単位ではなく、ファイル単位に判定しますので、change 指定した場合"           ).append( CR )
-                       .append( "でも、対象行は、見つかった行ですただし、下流に対して、見つからない"                       ).append( CR )
-                       .append( "場合だけ処理を継続させます"                                                                                                   ).append( CR )
-                       .append( "-inEncode は、入力ファイルのエンコード指定になります"                                                              ).append( CR )
+                       .append( "でも、対象行は、見つかった行ですただし、下流に対して、見つからない"                       ).append( CR )
+                       .append( "場合だけ処理を継続させます"                                                                                                   ).append( CR )
+                       .append( "-inEncode は、入力ファイルのエンコード指定になります"                                                              ).append( CR )
                        .append( "-outEncode は、出力ファイルのエンコードや、changeFileで指定の置換文字列"                          ).append( CR )
-                       .append( "ファイルのエンコード指定になります(changeFile は、必ず 出力ファイルと)"                                     ).append( CR )
-                       .append( "同じエンコードです"                                                                                                                            ).append( CR )
+                       .append( "ファイルのエンコード指定になります(changeFile は、必ず 出力ファイルと)"                                     ).append( CR )
+                       .append( "同じエンコードです"                                                                                                                            ).append( CR )
                        .append( "これらのエンコードが無指定の場合は、System.getProperty(\"file.encoding\") "              ).append( CR )
-                       .append( "で求まる値を使用します。"                                                                                                                 ).append( CR )
-                       .append( "-changeFile を使用することで、複数行の文字列に置換することが可能です"          ).append( CR )
+                       .append( "で求まる値を使用します。"                                                                                                         ).append( CR )
+                       .append( "-changeFile を使用することで、複数行の文字列に置換することが可能です"          ).append( CR )
                        .append( CR )
-                       .append( "上流(プロセスチェインのデータは上流から渡されます。)からのLineModel の"                                    ).append( CR )
-                       .append( "ファイルオブジェクトより、指定の文字列が含まれているか検索します"                                    ).append( CR )
+                       .append( "上流(プロセスチェインのデータは上流から渡されます。)からのLineModel の"                            ).append( CR )
+                       .append( "ファイルオブジェクトより、指定の文字列が含まれているか検索します"                                    ).append( CR )
                        .append( "上流プロセスでは、Name 属性として、『File』を持ち、値は、Fileオブジェクト"                     ).append( CR )
-                       .append( "である、Process_FileSearch を使用するのが、便利ですそれ以外のクラスを"                    ).append( CR )
+                       .append( "である、Process_FileSearch を使用するのが、便利ですそれ以外のクラスを"                    ).append( CR )
                        .append( "使用する場合でも、Name属性と、File オブジェクトを持つ LineModel を受け渡し"          ).append( CR )
-                       .append( "できれば、使用可能です"                                                                                                         ).append( CR )
+                       .append( "できれば、使用可能です"                                                                                                         ).append( CR )
                        .append( CR )
-                       .append( "引数文字列中に空白を含む場合は、ダブルコーテーション(\"\") で括って下さい"                  ).append( CR )
-                       .append( "引数文字列の 『=』の前後には、空白は挟めません必ず、-key=value の様に"         ).append( CR )
-                       .append( "繋げてください"                                                                                                                             ).append( CR )
+                       .append( "引数文字列中に空白を含む場合は、ダブルコーテーション(\"\") で括って下さい"                  ).append( CR )
+                       .append( "引数文字列の 『=』の前後には、空白は挟めません必ず、-key=value の様に"         ).append( CR )
+                       .append( "繋げてください"                                                                                                                             ).append( CR )
                        .append( CR ).append( CR )
                        .append( getArgument().usage() ).append( CR );
 
@@ -1006,7 +1012,7 @@ public class Process_Grep extends AbstractProcess implements ChainProcess {
        }
 
        /**
-        * このクラスは、main メソッドから実行できません
+        * このクラスは、main メソッドから実行できません
         *
         * @param       args    コマンド引数配列
         */