クリップボード内容を変数に入れてからgreNo.06418
mu76 さん 10/09/01 12:25
 
↓このように文字列変数を元にgrepをかけているのですが、
↓grepの結果ウィンドウに何も検索結果が表示されず困っております。

gofiletop;
searchdown "Apple", nocasesense;

 golinetop2;
 copyline;
 beginclipboardread;
 $AppleLine = getclipboard;
 grep $AppleLine, "*.txt", "C:\\text", noregular, nocasesense;

調べてみたのですがクリップボード内容を文字列変数に入れるときに、
正しく入っていないようで、
同等の内容の文字列(例えばクリップボードに「test」と入ってると)を

$AppleLine = "test";

このように変数に直接入れてからgrepすると問題なく検索結果が表示されました。


希望動作は
「検索して、ヒットした部分の文字列で(変数にいれて?)、grepをかける」
です。

どこを修正すると、希望通りの動作をしますでしょうか?

お手数おかけしますが、ご指導よろしくお願い致します。

[ ]
RE:06418 クリップボード内容を変数に入れNo.06419
秀まるお2 さん 10/09/01 13:26
 
 こちらでテストした限りでは、そのマクロのままでうまくgrepが実行されまし
たけども…

 とあえずですが、grep文の前に、

    message $AppleLine;

 とかの文を入れてみれば、getclipboardがうまくいってるかどうか分かってい
いんじゃないかと思います。こちらでは、たしかに検索でヒットした行の内容が
うまく変数に入ってることが確認出来ました。

 getclipboardを使わないやり方をするとしたら、gettext関数を使うのがいい
と思います。

 gofiletop;
 searchdown "Apple", nocasesense;
 golinetop2;
 #x1 = x; #y1 = y;
 golineend2;
 #x2 = x; #y2 = y;
 $AppLine = gettext( #x1, #y1, #x2, #y2 );
 message $AppLine;

 のようにしてみたらどうでしょ?

> 希望動作は
> 「検索して、ヒットした部分の文字列で(変数にいれて?)、grepをかける」
> です。

 今回のマクロは、ヒットした部分の文字列でgrepをかけるのではなくて、ヒッ
トした部分の「行全体の内容」でgrepをかけるような処理になると思います。

 もしも、ヒットした部分の文字列でgrepをかけるのでしたら、"Apple"でgrep
をかければいいだけになってしまうと思います。

 あるいは、何かの正規表現パターンで検索してヒットした、そのヒットした文
字列そのままでgrepしたいということでしたら、それはそれで、また別の作戦が
考えられます。ちょっと難しいですが、「動作環境・検索」の「検索での表示」
を「範囲選択」に切り替えて取得するようなマクロにする手があります。

 例えばですが、

    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    #SelectFound = getregnum( "SelectFound" );
    if( #SelectFound == 0 ) {
        writeregnum "SelectFound", 1;
        envchanged;
    }
    gofiletop;
    searchdown2 "Apple", nocasesense;
    $text = gettext( seltopx, seltopy, selendx, selendy );
    if( #SelectFound == 0 ) {
        writeregnum "SelectFound", 0;
        envchanged;
    }
    message $text;

 のような感じのマクロにする作戦があります。


 あと、searchdownだとファイル先頭にある"Apple"にはヒットしないので、
searchdown2にした方がいいんじゃないかと思います。

[ ]
RE:06419 クリップボード内容を変数に入れNo.06420
mu76 さん 10/09/02 11:39
 
> とあえずですが、grep文の前に、
>    message $AppleLine;

こちら試してみたのですが、問題なく変数に文字列が入っていました。
ただ、この状態でgrepに結果が表示されません;

> getclipboardを使わないやり方をするとしたら、gettext関数を使うのがいいと思
>います。

こちらを試してみました。

>> copyline;
>> beginclipboardread;
>> $AppleLine = getclipboard;

自分の↑部分を、教わったものに差し替えただけですが、バッチリ動きました!


> 今回のマクロは、ヒットした部分の文字列でgrepをかけるのではなくて、ヒット
>した部分の「行全体の内容」でgrepをかけるような処理になると思います。

こちら書き忘れておりました。
おっしゃるとおりでヒットした行内容でgrepをかけようとしてました。


> あと、searchdownだとファイル先頭にある"Apple"にはヒットしないので、
>searchdown2にした方がいいんじゃないかと思います。

ありがとうございます。
早速修正させていただきました。


原因が特定できず、少し気持ちが悪いのですが、どこかで凡ミスをやらかしているの
かもしれません。

ただ、自分の希望の動作が実現できましたので、前に進めそうです。
ありがとうございました!

[ ]
RE:06420 クリップボード内容を変数に入れNo.06421
秀まるお2 さん 10/09/02 11:49
 
 今テストしてみて分かったんですが、マクロの「copyline」は、行末の改行も
含めてクリップボードに入れるようです。getclipboardの返す値も改行文字付き
になります。

 なので、grepで検索する文字列が改行文字付きになって、それでヒットしなか
ったのだと思います。

 gettext()関数を使う作戦でいいと思います。

[ ]
RE:06421 クリップボード内容を変数に入れNo.06422
mu76 さん 10/09/02 16:26
 
> 今テストしてみて分かったんですが、マクロの「copyline」は、行末の改行も
>含めてクリップボードに入れるようです。getclipboardの返す値も改行文字付き
>になります。

なるほど!原因がわかってすっきりしました。

ありがとうございました!

[ ]