[ 新規に投稿する ]

grepreplaceが動作しないNo.10577
MAK98 さん 25/02/24 10:02 [ コメントを投稿する ]
  秀丸担当さん

エディタ会議室の方で こみやんま さんに教えていただいた (?#maxlines:nnn) を入れた正規表現置換ですが...これをマクロに持って行ったところ,動作しません.

grepreplace
"(?#maxlines:999)<table>([\\s\\S]*)(\n\t<tr>\n\t\t<td colspan=[\\s\\S]*</td>\n\t</tr>)\n\t</table>",
"<table>\\2\\1</table>",
"index*.html",
"D:\\work",
regular;

エラーは出ないのに置換が行われないので,おそらく検索文字列がマッチしてないと思われるのですが,検索文字列はエディタの置換ダイアログでは \\ を \ にして正常に動作しているものなので,その理由・対処法が分かりません.サジェスチョンをいただければ嬉しいです.必要であれば実際のファイルをお送りしますので,ご指示ください.

よろしくお願いします.
[ ]
RE:10577 grepreplaceが動作しないNo.10578
こみやんま さん 25/02/24 11:58 [ コメントを投稿する ]
  動作しない一番大きな原因は、
"index*.html" だと思います。
(多分、こういう部分ワイルドカードは動作しないんじゃないのかなぁ...)

「*.html」みたいな形しか対応してないんじゃないかと思います。
(grepダイアログで「index*.html」みたいな形でそもそもファイルがヒットするのか確認してみてください。)


次は、エスケープ(\\)ですが、考え方として2系統あります。

@系統目=手で記述する系

手で記述することを重視する場合は、""" で囲むのを推奨します。
これにより一切\によるエスケープは不要になります。
「文字列自体に"""」が存在するなら、"""""といったように、
絶対に被らない数で先頭と末尾を挟み込めばOK.

/// """の習得
message """\t""";
message """""\tあいうえお"""\n""""";


grepreplace
"""(?#maxlines:999)<table>([\s\S]*)(\n\t<tr>\n\t\t<td colspan=[\s\S]*</td>\n\t</tr>)\n\t</table>""",
"""<table>\2\1</table>""",
"""*.html""",
"""D:\work""",
regular;


A系統目=秀丸に書いてもらう

実際にgrep置き換え操作をして、それをそのままマクロになったものをゲットして当てはめる方法です。

1. メニューの「マクロ」→「キー操作の記録 開始/終了」(開始を意味する)
2. 実際に(マクロとして実行したい)grep置き換え操作を実際に秀丸上で操作します
3. メニューの「マクロ」→「キー操作の記録 開始/終了」(終了を意味する)
4.  メニューの「マクロ」→「キー操作の保存」をします。(*.macファイルとして保存します)

5. 4で保存したマクロの中身を見てみれば、grepreplaceマクロを記述する上での記述そのものが得られます。
[ ]
RE:10578 grepreplaceが動作しないNo.10581
MAK98 さん 25/02/24 14:51 [ コメントを投稿する ]
  こみやんま さん

レスポンスとサジェスチョンありがとうございます.

> 動作しない一番大きな原因は、"index*.html" だと思います。

これは,他の部分の grepreplace コマンドで動作実証済ですので,大丈夫だと思います.grep ウィンドウにもファイルへアクセス済と出ています.

> 次は、エスケープ(\\)ですが、考え方として2系統あります。

私もこれが一番怪しいと思うのですが...『@系統目=手で記述する系』はやはり動作しませんでした.
実際にどういう文字列が HmJre にわたっているかは message で見てみましたが,少なくともダイアログ上で見える限りでは,下記のような正常な正規表現検索文字列が渡っているように見えます.
(?#maxlines:999)<table>([\s\S]*)(\t<tr>\n\t\t<td colspan=[\s\S]*</td>\n\t</tr>\n)\t</table>

grepreplace でトライしてみた検索文字パターンは以下の通りです.すべて上記の文字列が渡っていますが,結果は同じでダメでした.

"(?#maxlines:999)<table>([\\s\\S]*)(\t<tr>\n\t\t<td colspan=[\\s\\S]*</td>\n\t</tr>\n)\t</table>",
"""(?#maxlines:999)<table>([\s\S]*)(\t<tr>\n\t\t<td colspan=[\s\S]*</td>\n\t</tr>\n)\t</table>""",
@"(?#maxlines:999)<table>([\s\S]*)(\t<tr>\n\t\t<td colspan=[\s\S]*</td>\n\t</tr>\n)\t</table>",
R"RegExStr((?#maxlines:999)<table>([\s\S]*)(\t<tr>\n\t\t<td colspan=[\s\S]*</td>\n\t</tr>\n)\t</table>)RegExStr",

> A系統目=秀丸に書いてもらう

grep 検索・置換ウィンドウではマクロで実行するのと同じ結果になってしまいますが,検索パターンは以下のようなものでした.もちろんこれをマクロに書いてやってもダメでした.
"(?#maxlines:999)<table>([\\\\s\\\\S]*)(\\t<tr>\\n\\t\\t<td colspan=[\\\\s\\\\S]*</td>\\n\\t</tr>\\n)\\t</table>",

要するに,秀丸エディタの『普通の検索置換』ダイアログ上で正規表現オプション・オンで行えば正常に置き換えができるのですが,同じものが grep ではダイアログ・マクロ共にできません.不思議です...というか,私にはお手上げです.
[ ]
RE:10581 grepreplaceが動作しないNo.10582
MAK98 さん 25/02/24 15:28 [ コメントを投稿する ]
  ちなみに,その『通常の置換ダイアログで成功した』ケースをマクロ記録して,その検索パターンを見てみました.下記のようになっていて,\n\t にエスケープが入っている点が違います.

"(?#maxlines:999)<table>([\\s\\S]*)(\\t<tr>\\n\\t\\t<td colspan=[\\s\\S]*</td>\\n\\t</tr>\\n)\\t</table>",

しかし,これをマクロに書いてやったら,やはり動作しませんでした.全面降伏寸前です.
[ ]
RE:10582 grepreplaceが動作しないNo.10583
こみやんま さん 25/02/24 15:51 [ コメントを投稿する ]
  > index*.html
あ、本当ですね、これは動作します。失礼しました。


元データが

<table>
    <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>職業</th>
    </tr>
    <tr>
        <td>山田太郎</td>
        <td>30</td>
        <td>会社員</td>
    </tr>
    <tr>
        <td>田中花子</td>
        <td>25</td>
        <td>学生</td>
    </tr>
    <tr>
        <td colspan="3">備考: データは架空のものです。</td>
    </tr>
</table>

(※4つのスペース=実際にはタブ1つ)

だとして、

grepreplace
"""(?#maxlines:999)<table>([\s\S]*)(\n\t<tr>\n\t\t<td colspan=[\s\S]*</td>\n\t</tr>\n)</table>""",
"""<table>\2\1</table>""",
"""index*.html""",
"""D:\work""",
regular;

みたいなので動作するっぽいですけどねぇ。
(手元では置き換わるので)
[ ]
RE:10583 grepreplaceが動作しないNo.10584
こみやんま さん 25/02/24 16:30 [ コメントを投稿する ]
  元のフォーマットがどこまで崩れることがあるのか不明なのでアレですが、

@多少「タブ」が「スペース」になっていたり、「タブ数が違っていた」としても吸収する形、
A1つのファイルに「複数の<table>〜</table>があっても大丈夫なようにするには、
下記みたいな感じだと思います。

grepreplace
"""(?#maxlines:999)<table>([\s\S]*?)(\n\s*?<tr>\n\s*?<td colspan=[\s\S]*?</td>\n\s*?</tr>)(\n\s*?)</table>""",
"""<table>\2\1\3</table>""",
"""index*.html""",
"""D:\work""",
regular;

ただ、「grep置き換えコマンドを記録」して、それをそのままマクロに
貼り付けても実行されないことがあるのだとすると、
何か秀丸がバグってるのかもしれないですねぇ。

[ ]
RE:10584 grepreplaceが動作しないNo.10585
MAK98 さん 25/02/24 17:08 [ コメントを投稿する ]
  >ただ、「grep置き換えコマンドを記録」して、それをそのままマクロに
>貼り付けても実行されないことがあるのだとすると、
>何か秀丸がバグってるのかもしれないですねぇ。

そうですね...正直ここまでやって『grep(replace)だけが』うまくいかないというのは,そういうこと(バグ)もあるのかな?と感じているところです.

秀丸担当さん,なにかコメントいただければ嬉しいです.必要であれば,問題の起きているデータそのものをお送りしますので.私が大ポカをやってる可能性も...
[ ]
RE:10583 grepreplaceが動作しないNo.10586
MAK98 さん 25/02/24 18:34 [ コメントを投稿する ]
  こみやんま さん

すみません,こちらの投稿を見逃してました.

たしかに,このシンプルなテストデータだと,こみやんま さんの検索パターンでも,私の検索パターンでも,どちらもちゃんと順番が置き換わります.

で,私の対象 HTML だと,どちらも置き換わりません(!).

ということは...秀丸エディタのバグなどではなく,私の対象 HTML のどこかに想定外のパターンが潜んでいるということになります.

秀丸担当さん,バグ云々の私の発言は忘れてください.
もう一度追究し直してみます.
[ ]
RE:10586 grepreplaceが動作しないNo.10587
MAK98 さん 25/02/24 19:29 [ コメントを投稿する ]
  こみやんま さん
秀丸担当さん

追究した結果,(私には)もっと不可思議なことが分かりました.
先に こみやんま さんが使われたテストデータ(タブ→半角空白4に変換):

<table>
    <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>職業</th>
    </tr>
    <tr>
        <td>山田太郎</td>
        <td>30</td>
        <td>会社員</td>
    </tr>
    <tr>
        <td>田中花子</td>
        <td>25</td>
        <td>学生</td>
    </tr>
    <tr>
        <td colspan="3">備考: データは架空のものです。</td>
    </tr>
</table>

これは こみやんま さんや私の検索パターンでどちらでも置き換えが成功します.ところが...上の三つの <tr></tr> 部分をこの2倍(6)にしてやると;

<table>
    <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>職業</th>
    </tr>
    <tr>
        <td>山田太郎</td>
        <td>30</td>
        <td>会社員</td>
    </tr>
    <tr>
        <td>田中花子</td>
        <td>25</td>
        <td>学生</td>
    </tr>
    <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>職業</th>
    </tr>
    <tr>
        <td>山田太郎</td>
        <td>30</td>
        <td>会社員</td>
    </tr>
    <tr>
        <td>田中花子</td>
        <td>25</td>
        <td>学生</td>
    </tr>
    <tr>
        <td colspan="3">備考: データは架空のものです。</td>
    </tr>
</table>

どちらの検索パターンでも動作しなくなります(!) もちろん,秀丸エディタの検索置換ダイアログからは問題なく動作します.
私の実データ(<tr></tr>が25セットあります)で置き換えが動作しないのは,この現象だったんですね.

検索でマッチできる文字列の長さには 4096 バイト(ですよね?)の制限があることは承知していますが,上のテストデータは当然ですがそれを越えていません.

やればやるほど訳が分からなくなっています...(哀)
[ ]
RE:10587 grepreplaceが動作しないNo.10588
こみやんま さん 25/02/24 20:25 [ コメントを投稿する ]
  これはピンときたかもw

メニューから「その他」「動作環境」「grepの動作」の「文字数制限の設定」が 「高速」になっていてバッファーがすごく小さくて
はみ出ちゃってるんだと思います(境界が1Kとかなのかな?)

「従来の動作」32Kとかにすれば引っかかってくうるかと。

[ ]
RE:10588 grepreplaceが動作しないNo.10590
MAK98 さん 25/02/24 21:22 [ コメントを投稿する ]
  こみやんま さん

半分...ビンゴ!でした.

おっしゃるように私の秀丸エディタは,grep 文字制限が『高速モード』になっていました.これを『無制限』に変更したところ,<tr></tr>6セットのモデルデータ(約 500 bytes)は無事に動作するようになりました.たった 500 bytes なのに高速モードの制限に抵触している?? よく分かりませんが.

しかし...私の目的のデータ(約 4300 bytes)では,今までと同じく動作しませんでした.秀丸マクロヘルプサイトの grepreplace 項目からリンクされている下のページによると,『検索/置換文字列には上限があります−Unicode 4094 文字』となっていますので,その制限に引っ掛かっているのかもしれません.
https://help.maruo.co.jp/hidemac/html/080_CmdStatement_Search_AboutSearchLimit.html

もしそうだとすると,秀丸エディタ自体のシステム的制限ということで,これはあきらめるしかないですね.悲しすぎますが.
秀丸担当さん,なにかシステム的な workaround は無いものでしょうか?

ユーザ側の私が考え付くのは,4094 文字の制限に引っ掛からないように grep 置換を分割するという手ですが...可能なのか?!
[ ]
(発言者削除)No.10591
MAK98 さん 25/02/24 22:04
 
[ ]
RE:10590 grepreplaceが動作しないNo.10592
MAK98 さん 25/02/25 06:38 [ コメントを投稿する ]
  こみやんま さん
秀丸担当さん

すみません,あれこれ疲労困憊でテストしているうちに混乱してしまったみたいです.高齢初心者は困ったものです.

こみやんま さんの『これはピンときたかもw』は,半分ビンゴではなく『ビンゴ!!』だったみたいです.
grep文字設定制限を解除しても私の目的のデータで動作しなかったのは,テストに用いた grep 検索文字列に \t が一つ抜けていたせいでした(お粗末).

結局,grep 文字設定制限を従来モード(1M)に設定して,本チャンの目的 HTML セットに対してマクロを実行してみたところ,すべてうまく動作しました.感激です.

秀丸のバグでも検索文字列長さの制約でもなく,私の秀丸設定環境の問題でした.お詫びします.>秀丸担当さん.
多分この件,これでクローズドだと思います.貴重なサジェスチョンに感謝します.> こみやんま さん.

※ grep 文字制限:高速モードでも,普通の検索置換ダイアログでうまく行っていたのは,いまだに謎ですが...それは grep 文字制限とは関係が無いということなのでしょうか?
[ ]
RE:10592 grepreplaceが動作しないNo.10594
秀丸担当 さん 25/02/25 17:52 [ コメントを投稿する ]
  最終的に解決されたようでよかったです。
検索/置換文字列の上限とは、たとえば入力欄に入力する文字列の上限ことで、正規表現によってマッチする対象の文字列の長さの上限というわけではないです。
grepの動作モードで、高速モードと従来モードで違うことがあったらなにか不具合かもしれません。
具体的なテキストや再現用マクロや[その他]→[設定内容の保存/復元...]の情報など、もし送っていただけるのであれば確認します。
送っていただける場合、"taki@maruo.co.jp"まで送ってほしいです。
[ ]
RE:10594 grepreplaceが動作しないNo.10595
MAK98 さん 25/02/25 18:24 [ コメントを投稿する ]
  秀丸担当さん

レスポンスありがとうございます.

> 最終的に解決されたようでよかったです。

そうですね.うまく動くようになったので,運用モードに入ったところです.

> 検索/置換文字列の上限とは、たとえば入力欄に入力する文字列の上限ことで、
> 正規表現によってマッチする対象の文字列の長さの上限というわけではないです。

了解しました.

> grepの動作モードで、高速モードと従来モードで違うことがあったらなにか不具合かもしれません。

今後のこともあるので,やはりチェックしていただきたいと思います.のちほど,できるだけ実際のものに近い再現セットを作成してお送りしますので,よろしくお願いいたします.
[ ]
RE:10594 grep設定による挙動の違いテストNo.10596
こみやんま さん 25/02/25 18:53 [ コメントを投稿する ]
  >grepの動作モードで、高速モードと従来モードで違うことがあったらなにか不具合かもしれません。

■この辺のヘルプ

https://help.maruo.co.jp/hidemaru/html/070_Env_Search_Grep_Warning.html


> この設定を「高速」または「従来の動作(バッファ大きい)」にすると、

というところが妙な感じですね。
(ヘルプと挙動の辻褄があっていない)


■3つのファイルで簡単なテスト

// test.mac------------------------------
grep
"""(?#maxlines:999)<table>([\s\S]+?)</table>""",
"*.html",
@"C:\test",
regular;


// C:\test\a.html
<table>
aaaa
</table>

// C:\test\b.html
<table>
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
嗚呼
</table>


動作環境のgrep*** が
@「高速」設定だと、a.html だけヒット
A従来の動作「バッファ小さい」だとa.htmlもb.htmlもヒット。


この時点で「ヘルプ」か「秀丸の実装」のどっちかはミスしてそうです。
[ ]
RE:10596 grep設定による挙動の違いテストNo.10597
秀丸担当 さん 25/02/26 10:12 [ コメントを投稿する ]
  MAK98さん、サンプルありがとうございます。
再現して確認できました。
こみやんまさんの例もありがとうございます。
調べてみて、高速のときはmaxlinesの上限が32になっていたことがわかりました。
同じになるように今後のバージョンで修正させていただきます。
[ ]
RE:10597 grep設定による挙動の違いテストNo.10598
MAK98 さん 25/02/26 11:27 [ コメントを投稿する ]
  秀丸担当さん

早速のご検討ありがとうございます.再現したということで安心しました.

>同じになるように今後のバージョンで修正させていただきます。

了解しました.いまのところは従来モードで問題なく動いていますが,よろしくお願いいたします.

※ 蛇足ながら,秀丸マクロに触れてみて,そのパワーに感動しています.HTML の一括自動改造がこのように実現するとは正直思ってなかったです.
[ ]
RE:10597 grep設定による挙動の違いテストNo.10630
MAK98 さん 25/03/11 09:37 [ コメントを投稿する ]
  秀丸担当さん

β版をちょっと見逃していたのですが,9.46β1の grep - fast で正常に動作することを確認しました.ありがとうございます.
[ ]
RE:10630 grep設定による挙動の違いテストNo.10631
秀丸担当 さん 25/03/11 13:33 [ コメントを投稿する ]
  ご確認ありがとうございます。
情報いただき問題点が見つかって助かります。
[ ]

[ 新規に投稿する ]