|
以下でどうでしょうか。
示されたサンプルでは意図したように動くと思います。
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;
|
|