最初に該当した条件を満たす複数行の削除No.10100
tack さん 23/03/18 19:42
 
いつもお世話になっております、tackと申します。

マクロによってファイルの先頭から最初に条件を満たした複数行を削除したいと思い、
過去ログを参考にしつつ試行錯誤したのですが上手くいかないため質問させてくださ
い。

ファイル内容(マクロ実行前)
******************************************

ab_0123abcdefg
hs_abcdefg
bg_abc_0001
hs_ABCDEFG
ab_0123abcdefg
bg_abc_0001
bg_abc_0001
今日の献立は焼き魚
明日の献立は湯豆腐
bg_abc_0001
ab_0123abcdefg
bg_abc_0002
bg_abc_0002

******************************************


ファイル内容(マクロ実行後)
******************************************

今日の献立は焼き魚
明日の献立は湯豆腐
bg_abc_0001
ab_0123abcdefg
bg_abc_0002
bg_abc_0002

******************************************

といったように、最初に出現した「abを先頭とする行」から「bgを先頭とする」行が
最初に2回連続で出現した時、2回連続の2回目の「bgを先頭とする行」を含み全てを
削除したいのです。
※ab_、hs_、bg_、の後の文字列は英数字と_のランダム配列になります。

試しに過去ログを参考に

setcompatiblemode 0x20000;
begingroupundo;
gofiletop;
searchdown "ab";
if(result!=false){
  beginsel;
  searchdown "bg";
  searchdown "bg";
  if(result!=false){
    moveto foundendx,foundendy;
    delete;
  }

endgroupundo;

とマクロを組んでみましたが
searchdown "ab"; だと 文中の23 ab cdのabが検索されるのは分かります。
しかしsearchdown "ab_";にすると2回目のab_0123abcdefgのab_が対象になり思った
ようにいきません。
また2回目のbgを検索対象とするために  searchdown "bg";を2回書くのもマクロとし
てはおかしい気もしております。

アドバイスをいただきたく存じます。よろしくお願いします。

[ ]
RE:10100 最初に該当した条件を満たす複数No.10101
yamashita さん 23/03/18 21:41
 
以下でどうでしょうか。
示されたサンプルでは意図したように動くと思います。
2箇所で行っている検索は、どちらも正規表現を使っています。
正規表現の "\nbg[^\n]*\nbg[^\n]*\n" は、
「改行の後に "bg" が続き、その後に改行ではない文字が0文字以上続き、その後に
改行文字が続き、その後に "bg" が続き、その後に改行ではない文字が 0 文字以上
続き、その後に改行文字が続く」という意味です。
正規表現の "^ab[^\n]*\n" は、
「行頭の後に "ab" が続き、その後に改行ではない文字が0文字以上続き、その後に
改行文字が続く」という意味です。
(正規表現は、環境によって方言がありうるので、秀丸マクロの正規表現の仕様は、
秀丸マクロのヘルプで確認するべきです。)

  // ファイル先頭から、
  // 「最初の「"bg" を先頭とする行が2行続いている箇所」」を下方向に探し、
  // 見つかったら、その行の lineno を #ln2 に確保し、
  // 「"ab" を先頭とする行」を上方向に探し、見つかったら、
  // 最後に見つかった「"ab" を先頭とする行」の lineno を #ln1 に確保し、
  // (column, lineno) で (0, #ln1) から (0, #ln2 + 1) の前までを削除する。
  setcompatiblemode 0x20000;
  begingroupundo;

  // 最初の「"bg" を先頭とする行が2行続いている箇所」の、2行目の lineno を取
得する。
  gofiletop; // ファイル先頭に移動する。
  searchdown "\nbg[^\n]*\nbg[^\n]*\n", regular;
  if (result) {
    // 「"bg" で始まる行が2行続いている箇所」が見つかった。
    #ln2 = lineno + 2; // 「"bg" で始まる行が2行続いている箇所」の次の行の l
ineno を #ln2 とする。

    // 最初の「"ab" を先頭とする行」の lineno を取得する。
    #ln1 = -1; // 「"ab" を先頭とする行」が見つからなければ、#ln1 は、-1 の
まま。
    while (1) {
      searchup "^ab[^\n]*\n", regular;
      if (result) {
        #ln1 = lineno; // 見つかった行の lineno を、#ln1 に確保する。
      } else {
        break;
      }
    }
    // ここに来た時点で、
    // 「"ab" を先頭とする行」が見つかっていなければ、#ln1 = -1 であり、
    // 見つかっていれば、最後に見つかった「"ab" を先頭とする行」の lineno が
 #ln1 に入っている。
    if (#ln1 != -1) {
      // 「"ab" を先頭とする行」が見つかった。
      // (column, lineno) = (0, #ln1) から、
      // (column, lineno) = (0, #ln2 + 1) の前までを、
      // 削除する。
      moveto2 0, #ln1;
      beginsel;
      moveto2 0, #ln2 + 1;
      delete;
    }
  }
  endgroupundo;
  endmacro;

[ ]
RE:10101 最初に該当した条件を満たす複数No.10102
h-tom さん 23/03/18 23:15
 
h-tom です。

最初のマクロから searchdown を searchdown2 に変更して、正規表現使えばいいの
では?
searchdown と searchdown2 の違いはマクロヘルプ参照。

修正前:searchdown "ab";
修正後:searchdown2 "^ab_", regular;

修正前:searchdown "bg";
        searchdown "bg";
修正後:searchdown2 @"^(bg_.+\n){2}",regular;

[ ]
RE:10102 最初に該当した条件を満たす複数No.10103
tack さん 23/03/19 01:13
 
>yamashita様
確かに思う通りの動作ができました、参考にさせていただきます!


>h-tom様
アドバイスを基に

******************************************

gofiletop;
searchdown2 "^ab_",regular;
if(result!=false){
  beginsel;
  searchdown2 @"^(bg_.+\n){2}",regular;
  if(result!=false){
    moveto foundendx,foundendy;
    delete;
  }
}

******************************************

と作成してみましたが、上手く動作しませんでした。
もしよろしければ修正点をアドバイスいただけましたら幸いです。

[ ]
RE:10103 最初に該当した条件を満たす複数No.10104
h-tom さん 23/03/19 07:37
 
h-tom です。

>>h-tom様
>アドバイスを基に
<省略>
>と作成してみましたが、上手く動作しませんでした。
>もしよろしければ修正点をアドバイスいただけましたら幸いです。
どう、上手く動作しなかったのでしょうか?
私の環境だと問題ありませんけどね。(秀丸エディタのバージョンは、Ver.9.21β5)

//-----------------------
ab_0123abcdefg
hs_abcdefg
bg_abc_0001
hs_ABCDEFG
ab_0123abcdefg
bg_abc_0001
bg_abc_0001
今日の献立は焼き魚
明日の献立は湯豆腐
bg_abc_0001
ab_0123abcdefg
bg_abc_0002
bg_abc_0002
//-----------------------

//-----------------------
今日の献立は焼き魚
明日の献立は湯豆腐
bg_abc_0001
ab_0123abcdefg
bg_abc_0002
bg_abc_0002
//-----------------------

秀丸エディタのバージョンによっては、
searchdown2 @"^(bg_.+\n){2}",regular;
あたりでエラーになる場合もありますが。

[ ]
RE:10104 最初に該当した条件を満たす複数No.10105
tack さん 23/03/19 12:42
 
h-tom様

どう上手く作動しなかったか?とありますが、実行前と実行後に変化がなくマクロが
終了しています。

使用している秀丸はver9.13 32bitになります。

[ ]
RE:10105 最初に該当した条件を満たす複数No.10106
tack さん 23/03/19 16:43
 
まだうまく解決できていないのに恐縮ではありますが、上記マクロで解決した後に更
に置換を行いたいと考えています。

上記マクロ完了後
//-----------------------
今日の献立は焼き魚
明日の献立は湯豆腐
bg_abc_0001
ab_0123abcdefg
bg_abc_0002
bg_abc_0002
//-----------------------

更に別マクロ処理後
//-----------------------
メニュー表「bg_abc_0001」
メニュー表「bg_abc_0002」

今日の献立は焼き魚
明日の献立は湯豆腐
メニュー bg_abc_0001
ab_0123abcdefg
メニュー bg_abc_0002
メニュー bg_abc_0002
//-----------------------

要はbg_abc_から始まる内容を検索したうえで保持し、その結果を挿入と置換したい
のです。


作成してみたマクロは以下の通りです。
//-----------------------
setcompatiblemode 0x20000;
begingroupundo;
gofiletop;

gofiletop;
#b = 0;
#c = 0;
while( 1 ) {
    searchdown2 "(?<=bg).*", regular;
    if( !result ) break;
    $bg[#b] = gettext( foundtopx, foundtopy, foundendx, foundendy );
//    message $bg[#b];
    #b = #b + 1;
    right;
}
gofiletop;

while( #c < #b ){
    //データの挿入
    insert "メニュー表「bg" + $bg[#c] + "」\n";
    replaceall"^bg_(.*)", "メニュー bg" + $bg[#c] + "", regular, nocasesens
e, nohilight;
    #c = #c + 1;
}

endgroupundo;

//-----------------------
結果

//-----------------------
メニュー表「bg_abc_0002」
メニュー表「bg_abc_0002」
メニュー表「bg_abc_0001」
今日の献立は焼き魚
明日の献立は湯豆腐
メニュー bg_abc_0001
ab_0123abcdefg
メニュー bg_abc_0001
メニュー bg_abc_0001
//-----------------------

と挿入は順番が逆になってしまい、置換については最初に該当した内容で全て書き換
えをおこなってしまいました。
恥ずかしい限りではありますが、こちらにつきましてもご教授いただければ幸いです。

[ ]
RE:10105 最初に該当した条件を満たす複数No.10107
h-tom さん 23/03/19 17:36
 
h-tom です。

>どう上手く作動しなかったか?とありますが、実行前と実行後に変化がなくマクロ
>が終了しています。
ということは、検索がうまくいっていないのでしょう。
適当に正規表現を調整してみては?
yamashita さんのマクロが動いているなら、試しに "_" を削って見るとか。

[ ]
RE:10107 最初に該当した条件を満たす複数No.10108
tack さん 23/03/19 18:09
 
h-tom様

前コメントでいただきました

秀丸エディタのバージョンによっては、
searchdown2 @"^(bg_.+\n){2}",regular;

の@を削ったら動作しました、確認不足で申し訳ありません。
この@はどういう意味なのでしょうか?もし差し支えなければ後学のためにお教えく
ださい。

[ ]
RE:10108 最初に該当した条件を満たす複数No.10109
h-tom さん 23/03/19 21:52
 
h-tom です。

>の@を削ったら動作しました、確認不足で申し訳ありません。
>この@はどういう意味なのでしょうか?もし差し支えなければ後学のためにお教えく
>ださい。
マクロヘルプを参照。
https://help.maruo.co.jp/hidemac/html/040_Statement_String.html

[ ]
RE:10109 最初に該当した条件を満たす複数No.10110
tack さん 23/03/19 21:58
 
h-tom様

正規表現で調べていたりしましたが見落としていたようです、お教えいただきありが
とうございます!

[ ]