任意の改行数を含む検索No.02342
yamasan さん 01/07/12 19:00
 
こんにちは、yamasanです。お願いします。

<!-- 2001/03/12 13:12:58 Ver1.8A -->
というような、"<!--"で始まり、"-->"で終わる文字列を削除したいという場合、
 最初は、"<!--[^-->]*-->"で検索しましたが、だめで、
"<!--[^>]*-->"で上手くいくようです。
(もちろん、秀丸Q&Aを参考にしました。)

失敗したのは、分かっていただけると思います。何せ、初心者ですので。(T_T)

そこで、次のように、改行が、複数で、そして、改行数は、決まってなくて、
任意に出現するものを検索したい場合は、どのように、マクロでするんですか?

<!-- 2001/03/12 13:12:58
 2001/03/12 13:12:58
Ver1.8A -->

<!-- 2001/03/12 13:12:58 山田 
 2001/03/12 13:12:58 山田 
2001/03/12 13:12:58 山田 
 2001/03/12 13:12:58 山田 
 Ver1.8A -->

というような例です。
while とか if かが 私には分からないので、勉強させて頂きたいです。
(while とか if は、関係ないですか?)お願い申し上げます。

[ ]
RE:02342 任意の改行数を含む検索No.02343
TAKA さん 01/07/12 19:37
 
TAKA です。

>そこで、次のように、改行が、複数で、そして、改行数は、決まってなくて、
>任意に出現するものを検索したい場合は、どのように、マクロでするんですか?

すでに読まれたかもしれませんが、
第IV部〜テキスト編集を極める!!
正規表現について
【5】 (補足) 秀丸上での複数行にまたがる検索について
http://win.blue.co.jp/~jr-kun/qa5prev/hidemaru_qa/4_regulr.html#RETURNS
に書いてある制限にひっかかる為ですね。

無制限ではありませんが、
<!--([^>]|\n|\n|\n|\n|\n)*-->
とすれば、マクロを使わなくても検索可能です。
\nを5つ書きましたので、6行までが対象になります。


マクロでやるなら、以下のようにしたらどうでしょうか?
// マクロ(ここから)
    $SearchBuf  = searchbuffer; // 検索条件退避
    #SearchOpt  = searchoption;
    disabledraw;

    #X = column + 1;        // 座標退避
    #Y = lineno;

    searchdown "<!--";
    if( !result )
    { // 検索されなかった
        beep;
        goto LEND;
    }
    #X_S = column + 1;
    #Y_S = lineno;

    searchdown "-->";
    if( !result )
    { // 検索されなかった
        movetolineno #X, #Y;    // 元の位置へ戻す
        beep;
        goto LEND;
    }
    #X_E = column + 1;
    #Y_E = lineno;

    // 選択させる
    movetolineno #X_S, #Y_S;
    beginsel;
    movetolineno #X_E + 3, #Y_E;

LEND:
    setsearch $SearchBuf, #SearchOpt;   // 検索条件復帰
    enabledraw;
    endmacro;
// マクロ(ここまで)

[ ]
RE:02342 任意の改行数を含む検索No.02344
ひろ さん 01/07/12 19:49
 
 yamasan さん今日は、ひろです。
> というような、"<!--"で始まり、"-->"で終わる文字列を削除したいという場合、
<中略>
> 改行が、複数で、そして、改行数は、決まってなくて、
> 任意に出現するものを検索したい場合は、どのように、マクロでするんですか?
<中略>
> while とか if かが 私には分からないので、勉強させて頂きたいです。
> (while とか if は、関係ないですか?)お願い申し上げます。
 「ファイル全体」といった処理をする場合に必要になると思います。「ファ
イル全体の処理をするマクロを以下に記載します。それではしっかり学習し
てください(^^)。
//---------------- delte HTML comment? ------------------------------
//検索状態を保持
#reg_search=searchmode;
$search=searchbuffer;
#search=searchoption;
if( !#reg_search ){
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  writeininum "SelectFound",1;
  envchanged;
  closereg;
}
//マクロのメイン
gofileend;
while( 1 ){
  searchup "<!--";
  if( !result )break;
  #bx = seltopx;
  #by =seltopy;
  left;
  searchdown "-->";
  moveto selendx,selendy;
  beginsel;
  moveto #bx,#by;
  delete;
}
//検索を初期状態に戻す
if( !#reg_search ){
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  writeininum "SelectFound",#reg_search;
  envchanged;
  closereg;
}
setsearch $search, #search;

[ ]
RE:02344 任意の改行数を含む検索No.02345
TAKA さん 01/07/12 20:12
 
TAKA です。

>  searchdown "-->";

安全のために、
  searchdown "-->";
  if( !result )break;
とした方が良いのでしょうか?


while とか ifなどは、ヘルプの
>if文は,その直後にある条件式が0以外の場合に次のコマンドを実
>行します。条件式が0で,かつ次のコマンドのうしろにelseがある
>場合は,elseに続くコマンドを実行します。
という記述の中で、「条件式が0以外の場合」という意味が分から
ないのでしょうか? > yamasanさん

もし、そうなら、[hidesoft.2:07976 2001/03/13]のスレッドが参
考になるかもしれません。
特に、[7982]の
>ちなみに、評価の値は、真(0以外)か偽(0)で判断されますので、
という部分です。
#余計分からないかも

真と偽については、今後、Q&A集で取り上げた方がよさそうです。

[ ]
RE:02343 任意の改行数を含む検索No.02346
yamasan さん 01/07/12 21:13
 
yamasanです。いつも、ありがとうございます。TAKAさん。

 | 無制限ではありませんが、
 | <!--([^>]|\n|\n|\n|\n|\n)*-->
 | とすれば、マクロを使わなくても検索可能です。
 | \nを5つ書きましたので、6行までが対象になります。

とりあえず、10個ぐらい書いておけば、対応できそうです。
ありがとうございます。

 | マクロでやるなら、以下のようにしたらどうでしょうか?

印刷して、考えます。(~_~)
大変勉強になります。ありがとうございました。
(分からないのですが、これから何日か考えます。)

[ ]
RE:02344 任意の改行数を含む検索No.02347
yamasan さん 01/07/12 21:13
 
ひろ さん、こんばんは。yamasanです。

 |  「ファイル全体」といった処理をする場合に必要になると思います。「ファ
 | イル全体の処理をするマクロを以下に記載します。それではしっかり学習し
 | てください(^^)。

ありがとうございます。分かりそうで、分からないのです。
分かったかなと思っていると、全然マクロが動かないのです。
(それぢゃ、わかってないという話ですが。(T_T))

でも、こうやって、例を示してもらうと、
少しは、前進できそうな気が……。しているだけです。
こちらも、印刷して、しばらく考えます。
本当に、ありがとうございました。

[ ]
RE:02345 任意の改行数を含む検索No.02348
yamasan さん 01/07/12 21:13
 
再び、yamasanです。お邪魔します。

 | という記述の中で、「条件式が0以外の場合」という意味が分から
 | ないのでしょうか? > yamasanさん
 |
 | もし、そうなら、[hidesoft.2:07976 2001/03/13]のスレッドが参
 | 考になるかもしれません。

メールで配信してもらっているので、これなんかも、一度は、
目を通しているはずですが、全然記憶にありませんでした。(>_<)
申し訳ないです。

コピペで、一つのテキストファイルにして、印刷します。
そして時間をかけて、読んでみます。何回も読んでいると、
分からないなりに、分かることもあったりしますので。

ありがとうございました。いつも、すいません。失礼しました。
取り急ぎ、お礼まで、です。

[ ]
RE:02345 任意の改行数を含む検索No.02349
ひろ さん 01/07/13 12:41
 
 yamasan さん、TAKA さん今日は、ひろです。
>   searchdown "-->";
>   if( !result )break;
> とした方が良いのでしょうか?
 見つからなければ、カーソル位置が変化しないので、が動かず
   searchdown "-->";
   if( !result )continue;
とすれば安全ですね。

[ ]
RE:02349 任意の改行数を含む検索No.02350
TAKA さん 01/07/13 13:39
 
TAKA です。

>>   searchdown "-->";
>>   if( !result )break;
>> とした方が良いのでしょうか?
> 見つからなければ、カーソル位置が変化しないので、が動かず
>   searchdown "-->";
>   if( !result )continue;
>とすれば安全ですね。

細かいことなのですが、「continue」のメリットは何でしょうか?
私は、「-->」が見つからない時点で処理対象がないということで、
「break」だと思ったのですが。

最後に「escape」があった方がいいのかな?

[ ]
RE:02350 任意の改行数を含む検索No.02351
ひろ さん 01/07/13 18:21
 
 TAKA さん今日は、ひろです。
> 細かいことなのですが、「continue」のメリットは何でしょうか?
 ファイルの最後から行っているので、先頭方向には <!-- と --> の組が
残っている可能性があります。

[ ]
RE:02351 任意の改行数を含む検索No.02354
TAKA さん 01/07/13 21:37
 
TAKA です。

>> 細かいことなのですが、「continue」のメリットは何でしょうか?
> ファイルの最後から行っているので、先頭方向には <!-- と --> の組が
>残っている可能性があります。

ファイルの最後からでしたか。ファイルの最初からかと思っていま
した。
大変失礼しました。

[ ]
RE:02354 任意の改行数を含む検索No.02356
番頭++ さん 01/07/13 22:15
 
そんな問題ですか ???

.html は表示の問題で、先頭からタグを処理してるように思えます。
コメントを削除する。どちらから処理してもいいのですが。
矛盾を、察知したら、メッセージをだして、処理を中止とか、undo とか ...

初めで、if( updated ){ endmacro; } // とかではじめて ...
再度、元のファイルを読み込むとか、も、案です。

[ ]
RE:02343 任意の改行数を含む検索No.02364
yamasan さん 01/07/16 11:29
 
TAKA さん、こんにちは。yamasanです。

お教えいただいたマクロを利用して、以下のことを実験しましたが、
うまくいきませんので、お構いなければ、お願い申し上げます。
--------------
最初にお尋ねしたのは、
HTMLファイルの中にあるコメントを削除したいためのものでしたが、

今度は、保存したHTMLファイルのバナー広告部分を削除したい場合なのです。

"<DIV align=center><!--*/xxxxxxxx/*-->"
から始まり、
"<!--*/xxxxxxxx/*--></DIV>"で終わっている約26行ほどの部分を検索して、
削除したいということです。

アスタリスクは、"\\*"に置き換えてやりました。
しかし、これでは、うまく検索してくれなかったので、
マクロを
searchdown "<DIV align=center>";

searchdown "</DIV>";
に書き直し実行しましたら、

上のほうから、うまく検索されましたが、
最後の"</DIV>"の部分が、"</D"までしか、選択してくれませんでした。
"IV>" が検索から、漏れてしまいます。どうしたら、いいのでしょう。

もう一点、
このマクロを使って、削除する場合は、
 |     movetolineno #X_E + 3, #Y_E;
のあとに、delete;を付け加えたらいいんですか?

    movetolineno #X_E + 3, #Y_E;
    delete;
としたら、うまく動作してますが、これでいいのでしょうか?
--------------
いろいろと質問ばかりで申し訳ないですが、お願いします。

[ ]
RE:02349 任意の改行数を含む検索No.02365
yamasan さん 01/07/16 11:29
 
ひろ さん、こんにちは。yamasanです。お世話になっています。

 |    searchdown "-->";
 |    if( !result )continue;
 | とすれば安全ですね。

ということで、これを付け加えたりして、
マクロを実行しましたが、
"マクロエラー:文字列が指定されるべき所に数値が指定されています。"
という問題で、試せません。

 |   writeininum "SelectFound",1;
を、分からぬままに、
  writeininum "SelectFound","1";
としてみたりしましたが、予想通り違うようですし。
マクロの内容を、見ているのですが、やはり分からないです。

もう一つ、お教え願いたいこととして、このマクロでは、
gofileend;、searchup、searchdownという順序ですが、

gofiletop;、searchdown、searchup、ということにしてないのは、
コチラでは、うまくいかない場合があるからでしょうか?
お願いします。

[ ]
RE:02365 任意の改行数を含む検索No.02366
ひろ さん 01/07/16 12:05
 
 yamasan さん今日は、ひろです。
> "マクロエラー:文字列が指定されるべき所に数値が指定されています。"
 失礼。マクロコマンドが間違っていました。末尾のマクロで今度こそ上手
くいくと思います。
> もう一つ、お教え願いたいこととして、このマクロでは、
> gofileend;、searchup、searchdownという順序ですが、
>
> gofiletop;、searchdown、searchup、ということにしてないのは、
> コチラでは、うまくいかない場合があるからでしょうか?
 秀丸の上/下検索はカーソルより前、若しくは後ろからを検索対称にし、
カーソル以下/以上を検索するのではありません。ですから gofiletop でファ
イル先頭に飛び、searchdown で下検索を行うと、ファイル先頭の「<!--」
がヒットしません。
//---------------- delte HTML comment? ------------------------------
//検索状態を保持
#reg_search = searchmode;
$search = searchbuffer;
#search = searchoption;
if( !#reg_search ){
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  writeregnum "SelectFound",1;
  envchanged;
  closereg;
}
//マクロのメイン
gofileend;
while( 1 ){
  searchup "<!--";
  if( !result )break;
  #bx = seltopx;
  #by = seltopy;
  left;
  searchdown "-->";
  if( !result )continue;
  moveto selendx,selendy;
  beginsel;
  moveto #bx,#by;
  delete;
}
//検索を初期状態に戻す
if( !#reg_search ){
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  writeregnum "SelectFound",#reg_search;
  envchanged;
  closereg;
}
setsearch $search, #search;

[ ]
RE:02364 任意の改行数を含む検索No.02367
TAKA さん 01/07/16 13:01
 
TAKA です。

>上のほうから、うまく検索されましたが、
>最後の"</DIV>"の部分が、"</D"までしか、選択してくれませんでした。
>"IV>" が検索から、漏れてしまいます。どうしたら、いいのでしょう。
>
>もう一点、
>このマクロを使って、削除する場合は、
> |     movetolineno #X_E + 3, #Y_E;
>のあとに、delete;を付け加えたらいいんですか?
>
>    movetolineno #X_E + 3, #Y_E;
>    delete;
>としたら、うまく動作してますが、これでいいのでしょうか?

あとちょっとなのに、残念ですね。「+ 3」の意味を考えてもらえ
ればすぐに気が付くと思うのですが・・・
「searchdown」で検索された時のカーソル位置と、「movetolineno」
はカーソルの移動であることを考えてもらえれば、すぐに分かった
のですが・・・

まず、「searchdown」では、検索された文字列の先頭にカーソルが
移動します。つまり「</DIV>」の「<」の部分ですね。
で、選択のためにmovetolinenoで選択終了位置まで移動させますが、
その時には、#X_E(「</DIV>」を検索した場所)より6つ分右に移
動させた所にすればいいわけですから、「+ 3」のところを「+ 6」
に直せばいいですね。

ちなみに、検索に普通の文字列ではなく、正規表現を使った場合は
文字列の長さが分からないので「+ ?」という記述が出来ませんの
で、ひろさんのマクロのようにsearchdownで必ず選択されるように
して選択の開始と終了を取得できるようにするやり方もあります。
「その他→動作環境→ユーザーインターフェース→検索での表示」
で「点滅表示」になっている場合には、選択されませんので、一時
的に「範囲選択」にして、マクロ終了時に元に戻しています。
このような手法を使うことで汎用的に作ることが出来ます。
ただ、このような手法は、マクロを中断した場合に、マクロ内で書
き換えたものが元に戻らないので、ユーザーが設定した環境が元に
戻らないという弊害もあります。
メリットとデメリットがありますが、汎用で作るためには、避けて
通れません。

ただ、今回の場合に限って言えば、環境を書き換えない方がよさそ
うです。

削除のための「delete」の記述は正解です。

[ ]
RE:02366 任意の改行数を含む検索No.02368
yamasan さん 01/07/16 13:48
 
ひろ さん、ありがとうございました。yamasanです。

このマクロで、うまく動作しました。
自分では、まだまだ、マクロを書くことができないので、申し訳ありません。

 |  秀丸の上/下検索はカーソルより前、若しくは後ろからを検索対称にし、
 | カーソル以下/以上を検索するのではありません。ですから gofiletop でファ
 | イル先頭に飛び、searchdown で下検索を行うと、ファイル先頭の「<!--」
 | がヒットしません。
なるほど。理解できました。

[02364]でも、お尋ねした事項で、
 | "<DIV align=center><!--*/xxxxxxxx/*-->"
 | から始まり、
 | "<!--*/xxxxxxxx/*--></DIV>"で終わっている約26行ほどの部分を検索して、
ということなんですが、

ひろさんのマクロですと、
このまま、searchupに "<DIV align=center><!--*/xxxxxxxx/*-->"、
searchdownに "<!--*/xxxxxxxx/*--></DIV>" を入れると、
検索されます。(思ったことができて、嬉しいです!)
 ですが、アスタリスクの扱いが、"\\*"でなくても、そのまま"*"で、
文字列として認識されますが、どうしてなんでしょう。
("<DIV align=center><!--\\*/xxxxxxxx/\\*-->"では、
うまく検索できません。)

と言いますのは、普通のマクロでは、
searchdown "<DIV align=center><!--\\*/xxxxxxxx/\\*-->" , regular;
としなくては、検索できないので何故だろうと思いました。

それとも、Q&A集に載っていることなんでしょうか?
(見つけられませんでした。)

[ ]
RE:02367 任意の改行数を含む検索No.02369
yamasan さん 01/07/16 13:48
 
TAKA さん、ありがとうございました。yamasanです。

 | で、選択のためにmovetolinenoで選択終了位置まで移動させますが、
 | その時には、#X_E(「</DIV>」を検索した場所)より6つ分右に移
 | 動させた所にすればいいわけですから、「+ 3」のところを「+ 6」
 | に直せばいいですね。

思慮が足りませんでした。ごめんなさい。理解できました。

 | ただ、今回の場合に限って言えば、環境を書き換えない方がよさそ
 | うです。

いろいろと、考えることがあるんですね。
私には、ちょっと、思いつかないことばかりでして。
勉強させていただきました。ありがとうございました。

[ ]
RE:02368 任意の改行数を含む検索No.02370
ひろ さん 01/07/16 17:18
 
 yamasan さん今日は、ひろです。
> searchdown "<DIV align=center><!--\\*/xxxxxxxx/\\*-->" , regular;
 最後に regular オプションが付いている点が違います。

[ ]
RE:02370 任意の改行数を含む検索No.02371
yamasan さん 01/07/16 18:47
 
こんばんは、ひろさん。yamasanです。

 | > searchdown "<DIV align=center><!--\\*/xxxxxxxx/\\*-->" , regular;
 |  最後に regular オプションが付いている点が違います。

よくこのオプションが分かってませんでした。
こういうもんだと、憶えておきます。無駄なお手数を取らせました。
ごめんなさいです。失礼します。

[ ]
RE:02371 任意の改行数を含む検索No.02372
ひろ さん 01/07/16 19:19
 
 yamasan さん今日は、ひろです。
>  |  最後に regular オプションが付いている点が違います。
>
> よくこのオプションが分かってませんでした。
> こういうもんだと、憶えておきます。無駄なお手数を取らせました。
> ごめんなさいです。失礼します。
 謝られるようなことではないのですが(^^;。
 マクロヘルプで、「searchdown」をキーワードとして調べてみてください。
その上で秀丸 (本体の) ヘルプで「正規表現」をキーワードとして調べてみ
てください。
 また Q&A にも正規表現についての記載があります。

[ ]
RE:02372 任意の改行数を含む検索No.02374
yamasan さん 01/07/17 10:03
 
ひろ さん、こんにちは。yamasanです。

 | その上で秀丸 (本体の) ヘルプで「正規表現」をキーワードとして調べてみ
 | てください。
 |  また Q&A にも正規表現についての記載があります。

ご丁寧にありがとうございました。
エスケープ文字は、"\"をつけるので、
マクロ内では、"\\"となると思い込んでいたのです。

正規表現を使わない場合は、当てはまらないのですね。
正規表現を使うときにだけ、"\\"としなくては、ならないのが、
今分かりました。m(__)m

もう少し、勉強します。すいません。ありがとうございました。

[ ]