複数行の置き換えを教えてください。No.25663
cent さん 08/11/24 12:22
 
お世話になります。

初歩の質問ですがよろしくお願いします。

改行を挟んだ置き換えを教えてください。
c行からe行をnullに置き換える。

a
b
c
d
e
f



a
b
f

になるように、マクロで行いたいのですが
改行\nがあるとうまくいきません。

どのようにすればいいでしょうか?
ご指導をよろしくお願いいたします。


[ ]
RE:25663 複数行の置き換えを教えてくださNo.25664
K'zawa さん 08/11/24 14:45
 
centさん、こんにちは。
K'zawa/ユーザーです。

>改行を挟んだ置き換えを教えてください。
>c行からe行をnullに置き換える。
<省略>
>改行\nがあるとうまくいきません。

検索:c\nd\ne\n
置換:(空欄)
正規表現:ON

で出来ますよ。
マクロだと、

replacedown "c\\nd\\ne\\n", "", regular;

[ ]
RE:25663 複数行の置き換えを教えてくださNo.25665
encodingshiftjis さん 08/11/24 14:56
 
> マクロで行いたいのですが
簡単なものは 手操作の 再生で可能です

c行に カーソルを持ってくる、選択開始、e行に移動、を 削除です。
以上を
1.キー記録します。
2.テストデータで キー再生し、確認します。
3.出来上がった、キー記録を マクロソースに変換。
4.マクロの テストをします。
以上

キー記録開始、
ファイルの先頭に移動、
検索 c行、
選択開始、(選択開始 をメニューから見つけるのが肝かな、使わない人が多そうだ。)
検索 e行、
下の行の先頭に移動、 (範囲の微調整です)
削除
キー記録終了

ですかね。

[ ]
RE:25664 複数行の置き換えを教えてくださNo.25668
cent さん 08/11/25 02:03
 
K'zawa 様

ご丁寧にありがとうございます。

>replacedown "c\\nd\\ne\\n", "", regular;

複数行ありますので行単位の置き換えではなく
まとめての方法はございますか?

トライして動かない記述は
replaceallfast "c.*?d", "" ,regular ;
になります。(最初に書くべきでした)

よろしくお願いいたします。


[ ]
RE:25668 複数行の置き換えを教えてくださNo.25669
cent さん 08/11/25 02:05
 
replaceallfast "c.*?e", "" ,regular ;
でした。

[ ]
RE:25668 複数行の置き換えを教えてくださNo.25670
K'zawa さん 08/11/25 11:41
 
centさん、こんにちは。
K'zawaです。

>replaceallfast "c.*?d", "" ,regular ;

HmJre.dllの正規表現では、"."は"\n"以外の文字を意味します。
さらに"\n"を使った正規表現の仕様も絡みます。
なのでそうゆう書き方は無理です。
詳しくは、秀丸エディタのヘルプの、
検索系コマンド− 正規表現− \nを使った複数行検索の際の制限について
等を参照願います。

c〜dの間が広いなら、
cを検索ー選択開始ーdを検索…
とかしないとですね。

[ ]
RE:25669 複数行の置き換えを教えてくださNo.25671
秀丸担当 さん 08/11/25 11:42
 

間の行数が固定ならば、複数行であっても、K'zawaさんの言われる通りの方法で
できるのではないかと思います。
間の行の内容が任意の場合は、以下のようにしたほうがいいかもしれません。

置換ダイアログでは c\n.*\ne\n
マクロの場合 replacedown "c\\n.*\\ne\\n", "", regular;


改行が幾つあるか分からないような場合は、単純に置換ではできないです。
繰り返しの操作が必要ですが、encodingshiftjisさんの書かれている通りの方法
でできると思います。
選択開始コマンドは、通常のキー割り当てではShift+F6になります。

記録した内容をマクロ化することもできます。
少々難しくなってきますが、マクロを修正して繰り返す条件を変えることもでき
ます。
そういったことがもし必要でしたら、またご質問ください。

[ ]
RE:25671 複数行の置き換えを教えてくださNo.25674
cent さん 08/11/25 12:56
 
お答えありがとうございます。

>改行が幾つあるか分からないような場合は、単純に置換ではできないです。

cとeは決まっているのですが
その間の改行の数が定まっておらず
マクロでは実現できませんでした。

納得できました。
ありがとうございました。


[ ]
RE:25674 複数行の置き換えを教えてくださNo.25676
かめっぱち さん 08/11/25 16:18
 
例えば、以下の手順を考えてみればいかがでしょうか?
やっていることはごく単純で、不定複数行にも対応しますし、
マクロ自体の内容もreplace系で事足りるとおもいます。
よかったら、チャレンジしてみてください。

工程1: 行末に記号A(例えば■)を入れる。(元データの改行位置の記憶)
工程2: cとfの直前に記号B(例えば●)をいれる。
工程3: 改行をすべて削除。        (全体を一行に)
工程4: 置換(●⇒\n●)
工程5: ●で始まるる行と●を削除
工程6: 置換(■⇒\n)          (もとの改行位置の復元)

工程4’: 置換(●⇒●\n)
工程5’: ●から●までを選択削除 など

[ ]
RE:25676 複数行の置き換えを教えてくださNo.25680
cent さん 08/11/26 03:01
 
かめっぱち 様

教えていただいてありがとうございます。

aからfの行数が多いものですから
安直にc\nからe\nが一度に
置き換えればと考えました。

教えていただきました工程は実現は出来ましても
replaceallfast "\n", "" ,regular ;
replaceallfast "●", "\n●" ,regular ;
に処理時間がかかりそうな感じです。

今後ともよろしくお願いします。


[ ]
RE:25665 複数行の置き換えを教えてくださNo.25681
cent さん 08/11/26 03:55
 
encodingshiftjis 様
秀丸担当 様

お世話になります。
貴重なご意見ありがとうございます。

>検索 e行、
>下の行の先頭に移動、 (範囲の微調整です)

Try & Error 中です。

 setcompatiblemode 0x0F;
 searchup "c" , regular, nocasesense;
 beginsel;
 searchdown "f" , regular, nocasesense;
 delete;

eが残ってしまう為
fまで範囲指定を行って
結果は出るようになったのですが。

e\nまで削除したいのですが
良い方法はないでしょうか?

よろしくお願いいたします。

[ ]
RE:25681 複数行の置き換えを教えてくださNo.25682
ENCODINGSHIFTJIS さん 08/11/26 09:23
 
>下の行の先頭に移動、 (範囲の微調整です)
これも、手作業で できます。

1.検索パターンe が行頭にあるなら、↓キー。
2.行中にあるなら 「論理行末に移動」し →キー。(eのパターンがどこにあっても
対応できる)

 golineend2;
 right;

こういうのが エディター的な処理の世界、(カーソルを強く意識する)
文字列の配列を foreach で繰り返しの プログラムとは違う。

[ ]
RE:25680 複数行の置き換えを教えてくださNo.25683
かめっぱち さん 08/11/26 11:50
 
cent様

最近、空行の間から文字列を取り出すことをやっていたので余計な処理まで
書いてしまい、申し訳ありませんでした。

以下、参考マクロ
---------------------------
gofiletop;
replaceallfast "c","●\nc",regular;
replaceallfast "f","●\nf",regular;
gofiletop;
searchdown "●";
beginsel;
down;
searchdown "●";
down;
delete;
endmacro;

[ ]
RE:25683 複数行の置き換えを教えてくださNo.25684
cent さん 08/11/26 12:40
 
かめっぱち 様

ご丁寧にお教えいただきましてありがとうございます。
今後ともよろしくお願いいたします。


[ ]
RE:25682 複数行の置き換えを教えてくださNo.25685
cent さん 08/11/26 12:42
 
ENCODINGSHIFTJIS 様

ご丁寧な対応感謝いたします。

おかげさまでキー操作も体験することができました。

今後ともよろしくお願いいたします。


[ ]