特定個数目の文字列のみを置換するNo.05466
KS さん 07/03/13 15:01
 
今日から秀丸マクロに取り組み始めた超初心者です。

ファイル中に複数個の「aaaaa」という文字列が出てきます。
その中の例えば3個目、5個目、21個目のみを「bbbbb」に置換し、そして22個目は
また1個目として数え直し、同様にファイルの終わりまで置換を繰り返す、というマ
クロを作ろうとしているのですが、文法エラーと出るばかりで、どうにもうまくいき
ません。

//========
while (code !=eof) {
 #count = 1; // カウントを1にする
 while (#count < 3) {searchdown "aaaaa" ; #count = #count+1;} //aaaaaを探し
て、カウントに1を足す
  replacedown "aaaaa" , "bbbbb"; //カウントが3ならaaaaaをbbbbbに置換
 while  (#count < 5) {searchdown "aaaaa" ; #count = #count+1;} //カウントが5
になるまでaaaaaを探してカウントに1を足す
  replacedown "aaaaa" , "bbbbb"; //カウントが5ならばaaaaaをbbbbbに置換
 while (#count < 21) {searchdown "aaaaa" ; #count = #count+1;} //カウントが2
1になるまでaaaaaを探して1をカウントに足す
 replacedown "aaaaa" , "bbbbb"; //カウントが21ならばaaaaaをbbbbbに置換
 } //カウントを1にして処理を繰り返す
//===========

秀丸マクロの解説本を買って、しっかり基礎から勉強しなければならないのは重々承
知の上で、どなたかご教授いただければと思います。

[ ]
RE:05466 特定個数目の文字列のみを置換すNo.05467
ぷれりゅ〜ど さん 07/03/13 15:24
 
ぷれりゅ〜ど@1ユーザです、こんにちは。

文法エラーになっているのは、全角の空白では?
> while (#count < 3) {searchdown "aaaaa" ; #count = #count+1;} //aaaaaを探
>して、カウントに1を足す

お書きになっているマクロが此処に掲載されている通りだとすると、
この//の前が全角空白になってるのが問題だと思います。

ただ、そこを直して走らせても、
テキストの終わりまで行っても、マクロが終わらない気がしますが(^^;


[ ]
RE:05466 特定個数目の文字列のみを置換すNo.05468
山紫水明 さん 07/03/13 21:26
 
 KSさん,

>ファイル中に複数個の「aaaaa」という文字列が出てきます。
>その中の例えば3個目、5個目、21個目のみを「bbbbb」に置換し、そして22個
>目はまた1個目として数え直し、同様にファイルの終わりまで置換を繰り返す、

 動作環境の「検索での表示」が「範囲選択」ならば,次のようにできるでしょ
う。
 もし「点滅表示」ならば,少し工夫が必要になります。
//-----------------------------------------------------//
gofiletop;
#count = 1;
while( 1 ) {
    searchdown2 "aaaaa";
    if( !result ) break;
    if( #count == 3 || #count == 5 || #count == 21 ) insert "bbbbb";
    #count = #count + 1;
    if( #count == 22 ) #count = 1;
}
endmacro;
//-----------------------------------------------------//

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:05468 特定個数目の文字列のみを置換すNo.05469
KS さん 07/03/14 06:02
 
ぷれりゅ〜どさん
ご指摘の全角を消したら、うまく実行しましたが、おっしゃるとおり、止まらな
い、、、。でif( ! result )  break;を最後の}の前に書き入れたら、止まってくれ
たのは良いのですが、なぜか私の望んでいる個数個目で置換されません。

それで、山紫水明さんが書いてくださったマクロを(いつか、こんなすっきりしたマ
クロを私も書けるようになりたいものだと思いながら)試してみました。挿入を置換
に書き換えて実行してみましたら、置換した場合に#countに1が足されないので、次
からずれて、3個目、4個目、19個目が置換されてしまいました。それで、if文を
//-------------
if( #count == 3 || #count == 5 || #count == 21 ){ replacedown "aaaaa" , "bbb
bb"; #count = #count + 1;}
 else{#count = #count + 1;}
//-------------
と書き換えたら、うまくいきました。

ぷれりゅ〜どさん、山紫水明さん、どうもありがとうございました。
また、この掲示板にはお世話になるかと思いますが、よろしくお願いいたします。

[ ]
RE:05469 特定個数目の文字列のみを置換すNo.05470
K'zawa さん 07/03/14 10:44
 
KSさん、こんにちは。
K'zawa/ユーザーです。

>挿入を置換に書き換えて実行してみましたら、置換した場合に#countに1が
>足されないので、次からずれて、3個目、4個目、19個目が置換されてしまい
>ました。それで、if文を
>//-------------
>if( #count == 3 || #count == 5 || #count == 21 ){ replacedown "aaaaa" , "bbb
>bb"; #count = #count + 1;}
> else{#count = #count + 1;}
>//-------------
>と書き換えたら、うまくいきました。

マクロはこれで間違いではないのですが、
「挿入を置換に書き換えて実行したらずれた。」
と言うのは違うと思います。
//-------------
if( #count == 3 || #count == 5 || #count == 21 ) replacedown "aaaaa" , "bbbbb";
#count = #count + 1;
//-------------
で、ちゃんとできましたよ。

[ ]
RE:05470 特定個数目の文字列のみを置換すNo.05471
KS さん 07/03/15 05:02
 
K'zawaさん
私の思い違いを指摘してくださり、どうもありがとうございました。
おっしゃるとおり、elseを書き加えなくとも、大丈夫でした。
おそらく置換ではなく挿入だと、「aaaaa」の前に「bbbbb」が入れられるので、その
「aaaaa」をまたカウントしてしまうためにずれていたのが、置換ではそれがなくな
ったからということでしょうか。

今は、この続きとして、「next」という文字列がきたら、それが何個目の「aaaaa」
であろうと、#countを1に戻して再び3個目、5個目と数えていく、というマクロを作
ろうとしているのですが、いやはや五里霧中、悪戦苦闘、四苦八苦です。

searchdownでaaaaa|nextを探し、あったら、それを取得して、取得したものが「aaa
aa」であれば置換の方に、「next」であれば#countを1にしてまたsearchdownを続け
る、という流れになるのかなと思いますが、それを実行するコマンドがまったくわか
らないので、あちこちつついている最中です。

[ ]
RE:05471 特定個数目の文字列のみを置換すNo.05472
山紫水明 さん 07/03/15 21:31
 
 KSさん,

>今は、この続きとして、「next」という文字列がきたら、それが何個目の「
>aaaaa」であろうと、#countを1に戻して再び3個目、5個目と数えていく、とい
>うマクロを作ろうとしているのですが、いやはや五里霧中、悪戦苦闘、四苦八
>苦です。

少し複雑になりますね。
//-----------------------------------------------------//
gofiletop;
#count = 1;
while( 1 ) {
    searchdown2 "aaaaa|next", regular;
    if( !result ) break;
    $s = gettext( foundtopx, foundtopy, foundendx, foundendy , 1);
    if( $s == "next" ) {
        right;
        #count = 1;
        continue;
    } else if( #count == 3 || #count == 5 || #count == 21 ) {
        replacedown "aaaaa", "bbbbb";
    }
    #count = #count + 1;
    if( #count == 22 ) #count = 1;
}
endmacro;
//-----------------------------------------------------//

     では, (^^)/~
                                        山紫水明
                                        SANSHISUIMEI

[ ]
RE:05472 特定個数目の文字列のみを置換すNo.05475
KS さん 07/03/16 09:46
 
山紫水明さん
ありがとうございます!!
書いてくださったマクロ、ばっちりです。
で、gettextのコマンドを調べて、「このパラメータはこういう意味なのか、なるほ
ど」と勉強させていただきました。

これからもお世話になるかと思いますが、よろしくお願いいたします。

[ ]