ファイル末尾の改行を正規表現で削除したNo.04746
haru さん 05/06/22 11:58
 
    gofileend;
    while(1) {
        up;
        if ( code == 0x0D ) delete;
        else break;
    }


 ファイル末尾の改行を削除するために、上記マクロを考えました。
 一応動作はうまくいっているんですが、正規表現でもっと簡単に
できないかと思ったんですが、良い方法が思い付きません。
 お知恵を拝借したいのですが。
 よろしくお願いします。

[ ]
RE:04746 ファイル末尾の改行を正規表現でNo.04747
きいろいまふらあ さん 05/06/22 12:32
 
話がずれますが、

>    gofileend;
>    while(1) {
>        up;
>        if ( code == 0x0D ) delete;
>        else break;
>    }

これだと、例えば

あああああ(改行)
あああああ(改行)
あああああ[EOF]

というようなファイルが

あああああああああああああああ[EOF]

になっちゃったりしませんか?

[ ]
RE:04747 ファイル末尾の改行を正規表現でNo.04748
Iranoan さん 05/06/22 12:56
 
 今日は、Iranoan です。
> >    gofileend;
> >    while(1) {
> >        up;
> >        if ( code == 0x0D ) delete;
> >        else break;
> >    }
 私なら、
gofileend;
while( !column )backspace;
とします。秀丸の正規表現では、ファイルの終端の指定は出来ないので、置換
を使うのは無理でしょう。

[ ]
RE:04747 ファイル末尾の改行を正規表現でNo.04749
haru さん 05/06/22 13:08
 
 御忠告、ありがとうございます。

>>    gofileend;
      golinetop;
>>    while(1) {
>>        up;
>>        if ( code == 0x0D ) delete;
>>        else break;
>>    }
 とすることで、一応、回避できました。
 他にも何かあれば、御指摘下さい。

[ ]
RE:04747 ファイル末尾の改行を正規表現でNo.04750
きいろいまふらあ さん 05/06/22 13:17
 
話がずれたままで送信してしまいました。

ファイル末尾直前の改行は、正規表現のエンジンにHmJre.dllを使用している場
合は、\n(?!(.|\n))で表現できるようです。
ただし、連続する改行に一気にマッチさせるのは無理なので、ループを回すしか
ないんじゃないかと思います。

while(1){
  replaceallfast "\\n(?!(.|\\n))","",regular;
  if(result == false)break;
}

とでもなりましょうか?
正規表現を使わない方がスマートかもしれませんね。例えば……と思ったら、
Iranoanさんが正規表現を使わない例を書かれてますね。

蛇足ですが、下の★の部分の改行を削除したいのかどうかでマクロも多少変わっ
てくるんじゃないかと思います。

ああああ(改行)
あああ(改行)
あああああ(改行) ←★
(改行)
(改行)
[EOF]

[ ]
RE:04748 ファイル末尾の改行を正規表現でNo.04751
haru さん 05/06/22 13:26
 
>gofileend;
>while( !column )backspace;
>とします。秀丸の正規表現では、ファイルの終端の指定は出来ないので、置換
>を使うのは無理でしょう。
 わかりました。ありがとうございます。

 ところで、ファイル末尾のtab、空白のみからなる行を削除した
いのですが、ファイルの終端の指定は出来ないということなので、
どうすれば良いかわかりません。
 また、tab、空白のみからなる行で、行頭が>のもので、ファイル
末尾に位置するものも、削除したいのですが。
 よろしくお願いします。

[ ]
RE:04750 ファイル末尾の改行を正規表現でNo.04752
haru さん 05/06/22 13:33
 
>while(1){
>  replaceallfast "\\n(?!(.|\\n))","",regular;
>  if(result == false)break;
>}
 実行しました。
 相当、ゆっくりな感じですが、できました。


>蛇足ですが、下の★の部分の改行を削除したいのかどうかでマクロも多少変わっ
>てくるんじゃないかと思います。
 了解しました。
 ただ、★の部分の改行は削除してもしなくても、気になりません。
 ありがとうございます。

[ ]
RE:04751 ファイル末尾の改行を正規表現でNo.04753
Iranoan さん 05/06/22 15:49
 
 haru さん今日は、Iranoan です。
>  ところで、ファイル末尾のtab、空白のみからなる行を削除した
> いのですが、ファイルの終端の指定は出来ないということなので、
> どうすれば良いかわかりません。
>  また、tab、空白のみからなる行で、行頭が>のもので、ファイル
> 末尾に位置するものも、削除したいのですが。
>  よろしくお願いします。
 私なら次のマクロで行います。
 ##実は、受信したメールの処理に良く使っているマクロの一部です(^^;。
#search = searchmode;
$s = searchbuffer;
#s = searchoption;
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
writeregnum "SelectFound",1;
envchanged;
closereg;
gofileend;
while( !column )backspace;
setsearch "\\n[> ]*$", 0x10;
while( 1 ){
  findup;
  if( !result )break;
  if( lineno == linecount2 - 1 )delete;
  else break;
}
if( !#search ){
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  writeregnum "SelectFound",#search;
  envchanged;
  closereg;
}
setsearch $s, #s;

[ ]
RE:04746 ファイル末尾の改行を正規表現でNo.04754
ENCODINGSHIFTJIS さん 05/06/22 17:35
 
参加してみます。キー記録を少し調整

 gofileend;
 searchup "[^ \\t\\n>]" , regular, nocasesense, nohilight;
 if( ! result )  beep;
 escape;
 golinetop2;
 down;
 beginsel;
 gofileend;
 delete;

どうかな?

[ ]
RE:04753 ファイル末尾の改行を正規表現でNo.04755
haru さん 05/06/23 09:13
 
Iranoanさん、ありがとうございます。

> ##実は、受信したメールの処理に良く使っているマクロの一部です(^^;。
 私も同じ目的で使う予定です。

>#search = searchmode;
>$s = searchbuffer;
>#s = searchoption;
>openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>writeregnum "SelectFound",1;
>envchanged;
>closereg;
>gofileend;
>while( !column )backspace;
>setsearch "\\n[> ]*$", 0x10;
setsearch "\\n[>  \t]*$", 0x10;
>while( 1 ){
>  findup;
>  if( !result )break;
>  if( lineno == linecount2 - 1 )delete;
>  else break;
>}
>if( !#search ){
>  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
>  writeregnum "SelectFound",#search;
>  envchanged;
>  closereg;
>}
>setsearch $s, #s;

 上記を少し変えさせていただきました。
 うまくいきました。

[ ]
RE:04754 ファイル末尾の改行を正規表現でNo.04756
haru さん 05/06/23 09:22
 
> gofileend;
> searchup "[^ \\t\\n>]" , regular, nocasesense, nohilight;
> if( ! result )  beep;
> escape;
> golinetop2;
> down;
> beginsel;
> gofileend;
> delete;

>どうかな?
 実行してみました。
 変化はありません。
 秀丸ver3.00β30です。
 (例えば、新規に秀丸を開いて、改行を数行打ち込んだ場合で実行。)

 鶴亀メールでも実行しました。

> searchup "[^ \\t\\n>]" , regular, nocasesense, nohilight;
 で、「間違ったキーワードがあります。」が表示され、止まってしまいます。
 鶴亀ver4.17b6です。
 よろしくお願いします。

[ ]
RE:04756 ファイル末尾の改行を正規表現でNo.04757
でるもんた さん 05/06/23 10:29
 
> > searchup "[^ \\t\\n>]" , regular, nocasesense, nohilight;
>  で、「間違ったキーワードがあります。」が表示され、止まってしまいます。
>  鶴亀ver4.17b6です。
>  よろしくお願いします。

バージョンが少し古い(のかな?)のが気にかかりますが…
nocasesense, nohilight のキーワードを取ってみてはどうでしょう。
の検索パターンならそのへんの指定はあってもなくても関係ないはずです。

[ ]
RE:04757 ファイル末尾の改行を正規表現でNo.04758
haru さん 05/06/23 14:27
 
>>  鶴亀ver4.17b6です。

>バージョンが少し古い(のかな?)のが気にかかりますが…
 ver4.17b6は最新版ではないでしょうか?

>nocasesense, nohilight のキーワードを取ってみてはどうでしょう。
>の検索パターンならそのへんの指定はあってもなくても関係ないはずです。
 なくても、結果は同じでした。

 書き忘れました。win95です。
 よろしくお願いします。

[ ]
RE:04758 ファイル末尾の改行を正規表現でNo.04759
アルビレオ さん 05/06/23 17:11
 
秀丸ユーザーのアルビレオです。

>>>  鶴亀ver4.17b6です。
>
>>バージョンが少し古い(のかな?)のが気にかかりますが…
> ver4.17b6は最新版ではないでしょうか?

「秀丸」の最新版ではありませんね。
今の鶴亀ではnohilightは未サポートみたいです。

>>nocasesense, nohilight のキーワードを取ってみてはどうでしょう。
>>の検索パターンならそのへんの指定はあってもなくても関係ないはずです。
> なくても、結果は同じでした。

あれ?こちらではnohilightを削除すればエラーにはなりませんでしたよ?
鶴亀4.16で確認しました。

[ ]
RE:04759 ファイル末尾の改行を正規表現でNo.04760
haru さん 05/06/23 20:10
 
アルビレオさん、ありがとうございます。

>>>nocasesense, nohilight のキーワードを取ってみてはどうでしょう。
>>>の検索パターンならそのへんの指定はあってもなくても関係ないはずです。
>> なくても、結果は同じでした。
>あれ?こちらではnohilightを削除すればエラーにはなりませんでしたよ?
 言葉足らずで、すみません。エラーにはなりません。
 改行だけのテキスト対して実行しても、何の変化もないというこ
とです。

[ ]
RE:04746 ファイル末尾の改行を正規表現でNo.04761
白雲斎 さん 05/06/23 21:08
 
白雲斎と申します。

もう済んでいる話かもしれないですが、
私は、ファイル末尾の空白類(改行含む)を、以下の要領で削除しています。

gofileend;
left;
while( result && (code == 0x09 || code == 0x0D || code == 0x20) )
{
    delete;
    left;
}
endmacro;

__________________________________
Save the earth
http://pr.mail.yahoo.co.jp/ondanka/

[ ]
RE:04761 ファイル末尾の改行を正規表現でNo.04762
きいろいまふらあ さん 05/06/23 21:33
 
>gofileend;
>left;
>while( result && (code == 0x09 || code == 0x0D || code == 0x20) )
>{
>    delete;
>    left;
>}
>endmacro;

「行末<->次の行の行頭」移動の禁止 がONでなければ、これが一番簡単だし
応用がききますね。

[ ]
RE:04760 ファイル末尾の改行を正規表現でNo.04763
ENCODINGSHIFTJIS さん 05/06/24 09:24
 
> 改行だけのテキスト対して実行しても、何の変化もないということです。
 if( ! result ) beep;
の箇所でキャッチはできています、対応はしてませんが。

[ ]
RE:04761 ファイル末尾の改行を正規表現でNo.04764
haru さん 05/06/24 10:52
 
白雲斎さん、ありがとうございます。

>gofileend;
>left;
>while( result && (code == 0x09 || code == 0x0D || code == 0x20) )
while( result && (code == 0x09 || code == 0x0D || code == 0x20 || code == 33
088) )
>{
>    delete;
>    left;
>}
>endmacro;
 上記に変更し、全角スペースも削除し、利用させて頂きます。

[ ]