質問:文字列を含まない行抽出のための正No.00258
dszhm さん 07/01/30 15:48
 
WinXP Pro SP2 と 6.50 Beta 16 です。
ファイル/フォルダの名称をレコードに含む一覧ファイルが
あるとします。
この中から、ショートカット(*.lnk)を除外したいのですが、
「(現在の内容)」に対する grep で行いたいのですが、
どのように正規表現で記述したらいいでしょうか?

[ ]
RE:00258 質問:文字列を含まない行抽出のNo.00259
Iranoan さん 07/01/30 16:06
 
 dszhm さん今日は、Iranoan です。
> ファイル/フォルダの名称をレコードに含む一覧ファイルが
> あるとします。
> この中から、ショートカット(*.lnk)を除外したいのですが、
> 「(現在の内容)」に対する grep で行いたいのですが、
> どのように正規表現で記述したらいいでしょうか?
・元のファイルは一行一ファイルなのでしょうか?
  ファイル形式が解らないと何とも
・フォルダ名が .lnk になっている事は無いのでしょうか?
  有ったとしても、フォルダの最後は「\」は「/」という決まりが有れば問題
  ないのですが....。

[ ]
RE:00259 質問:文字列を含まない行抽出のNo.00260
dszhm さん 07/01/30 16:36
 
  Iranoan さん、こんにちは。
>・元のファイルは一行一ファイルなのでしょうか?
>  ファイル形式が解らないと何とも
  (1)DIR コマンドみたいな
     更新日付(yyyy/mm/dd 形式)
     更新時刻(HH:MM 形式)
     フォルダを示す <DIR> か、
       ファイルサイズ(3桁でのカンマ区切りあり)
     ファイル名称
       ダブルクォートされていません。
  (2)フルパス
     ダブルクォートされている場合もあります。
  です。
  (1)と(2)の間は、1つ以上のタブまたは空白です。
  ちなみに、検索の結果から「エクスプローラ拡張メニュー」を
  使って、上の(1)と(2)を横に並べたものです。
 
>・フォルダ名が .lnk になっている事は無いのでしょうか?
>  有ったとしても、フォルダの最後は「\」は「/」という決まりが有れば問題
>  ないのですが....。
  フォルダか否かは、(1)の3項目で分かります。
  また、フォルダの最後は「\」は「/」で終わってはいませんが、
  「.lnk」で終わるフォルダはありません。

コマンドラインから、「grep -v」が早いですかね?

[ ]
RE:00260 質問:文字列を含まない行抽出のNo.00261
Iranoan さん 07/01/30 17:03
 
 dszhm さん今日は、Iranoan です。
> コマンドラインから、「grep -v」が早いですかね?
 GNU grep 等があれば、その方が早いと思います。
 秀丸の grep ではヒットしない方の出力は出来ないので、置換でやった方が
早いでしょう。
>   (1)DIR コマンドみたいな
>      更新日付(yyyy/mm/dd 形式)
<snip>
>   (2)フルパス
>      ダブルクォートされている場合もあります。
の形式なら、検索文字列 (実際には一行↓) を
[0-9]{4}/[01][0-9]/[0-3][0-9][ \t]+[012][0-9]:[0-5][0-9][ \t]+
[0-9,]+[ \t]+.+?\.lnk"?\n
として空文字に置換すれば削除できます。(日付や時刻部分はあまり厳密では
ないけど。)

[ ]
RE:00261 質問:文字列を含まない行抽出のNo.00262
dszhm さん 07/01/30 17:25
 
>> コマンドラインから、「grep -v」が早いですかね?
> GNU grep 等があれば、その方が早いと思います。
> 秀丸の grep ではヒットしない方の出力は出来ないので、置換でやった方が
>早いでしょう。
>>   (1)DIR コマンドみたいな
>>      更新日付(yyyy/mm/dd 形式)
><snip>
>>   (2)フルパス
>>      ダブルクォートされている場合もあります。
>の形式なら、検索文字列 (実際には一行↓) を
>[0-9]{4}/[01][0-9]/[0-3][0-9][ \t]+[012][0-9]:[0-5][0-9][ \t]+
>[0-9,]+[ \t]+.+?\.lnk"?\n
>として空文字に置換すれば削除できます。(日付や時刻部分はあまり厳密では
>ないけど。)
  できました、ありがとうございました。

[ ]
RE:00262 質問:文字列を含まない行抽出のNo.00265
秀丸担当 さん 07/01/30 17:32
 

>>> コマンドラインから、「grep -v」が早いですかね?
>> GNU grep 等があれば、その方が早いと思います。
>> 秀丸の grep ではヒットしない方の出力は出来ないので、置換でやった方が
>>早いでしょう。

できてしまった後でなんですが、
(?<!\.lnk.*)$
という感じに書けばヒットしない方を出力できるかも。

[ ]
RE:00265 質問:文字列を含まない行抽出のNo.00289
dszhm さん 07/01/31 10:55
 
>できてしまった後でなんですが、
>(?<!\.lnk.*)$
>という感じに書けばヒットしない方を出力できるかも。
  やってみましたが、ダメでした。
  (?<!^.*\.lnk.*)$
  としてもダメでした。
  「検索した文字列を強調」をチェックした検索でヒットしている
  箇所をみると、行末の空文字列にヒットしているようです。

[ ]
RE:00289 質問:文字列を含まない行抽出のNo.00307
秀丸担当 さん 07/01/31 14:34
 

>  やってみましたが、ダメでした。
>  (?<!^.*\.lnk.*)$
>  としてもダメでした。
>  「検索した文字列を強調」をチェックした検索でヒットしている
>  箇所をみると、行末の空文字列にヒットしているようです。

行末の空文字列にヒットで正しいです。
行のどこかに「.lnk」が含まれる行の行末だけヒットしないと思います。

通常の検索ではうまくいっていると思いますが、grepで(現在の内容)の場合はな
ぜかできてませんでしたね…
grepで(現在の内容)の場合は、なぜか $ ではなく \n にしないとだめだったよ
うです。
(?<!^.*\.lnk.*)\n

なぜかというと、なぜでしょう。
これはこれで調べる必要がありそうです。


あと.lnkが必ず行末またはダブルクォーテーションで囲まれているのであれば
(?<!^.*\.lnk"?)\n
のほうがよかったかも。

[ ]
RE:00307 質問:文字列を含まない行抽出のNo.00310
秀丸担当 さん 07/01/31 16:08
 

>grepで(現在の内容)の場合は、なぜか $ ではなく \n にしないとだめだったよ
>うです。

こちらの件ですが、普通の検索とgrepで改行以降にヒットしてしまう場合の判定
が微妙に異なっている部分があったようで、次のβ版で一貫した結果となるよう
に修正します。

[ ]
RE:00307 質問:文字列を含まない行抽出のNo.00312
dszhm さん 07/01/31 16:40
 
>行末の空文字列にヒットで正しいです。
>行のどこかに「.lnk」が含まれる行の行末だけヒットしないと思います。
  「.lnk」を含んでいるか否かにかかわらず、
  行末にヒットしていました。

[ ]
RE:00307 質問:文字列を含まない行抽出のNo.00313
dszhm さん 07/01/31 16:43
 
>あと.lnkが必ず行末またはダブルクォーテーションで囲まれているのであれば
>(?<!^.*\.lnk"?)\n
>のほうがよかったかも。
  こちらは、うまくいきました。

[ ]
RE:00313 質問:文字列を含まない行抽出のNo.00318
秀丸担当 さん 07/01/31 17:40
 

>  「.lnk」を含んでいるか否かにかかわらず、
>  行末にヒットしていました。

そんなことはないはずですが。
少なくとも普通の検索ではできているはずです。(最初の例ではgrepではうまく
いきませんが)
なんだか納得いかないのでもう一度よく確認してほしいです。

もしそれでもできなかったという場合、何か想定外のこがあるかもしれないので、
できなかったときの具体的なテキストの例を教えてほしいです。

[ ]
RE:00318 質問:文字列を含まない行抽出のNo.00323
dszhm さん 07/01/31 23:08
 
>>  「.lnk」を含んでいるか否かにかかわらず、
>>  行末にヒットしていました。
>
>そんなことはないはずですが。
>少なくとも普通の検索ではできているはずです。(最初の例ではgrepではうまく
>いきませんが)
>なんだか納得いかないのでもう一度よく確認してほしいです。
  出勤したら、合間を見て再試行します。

>もしそれでもできなかったという場合、何か想定外のこがあるかもしれないので、
>できなかったときの具体的なテキストの例を教えてほしいです。
  「エクスプローラ拡張メニュー」がインストールされている
 必要があります。
 対象テキストの作成は、
 1. 空の秀丸エディタウィンドウを開きます。

 2. スタートメニューからの「ファイル/フォルダの検索」で
   ・全ドライブを対象に、
   ・全てのファイル種別
   ・特定期間内に更新された
   の条件で検索します。
   必ずでは有りませんが、大抵この中の見つかったファイルには
   ショートカットが含まれています。

 3. 検索結果に対して、エクスプローラ拡張メニューの
   「ファイル名をクリップボードにコピー」のなかの
  (1) 詳細情報、を選択
    「1.」に貼り付けます。

  (2) 同様に、長いパス名、を選択

  (3) 先頭行から、
    golineend2;
        して行末に移動し、全ての行で
    「3. の (1)」で貼り付けたはるか右になるように、
    タブを入力します。

  (4) 次のマクロで、「3. の (2)」のデータを貼り付けます。
    disabledraw;
    pasterect;
    enabledraw;

 これらの操作で作成しました。

[ ]
RE:00323 質問:文字列を含まない行抽出のNo.00329
秀丸担当 さん 07/02/01 10:53
 

>  「エクスプローラ拡張メニュー」がインストールされている
> 必要があります。
> 対象テキストの作成は、

エクスプローラ拡張メニューは使っているのでやってみようとしましたが、シ
ョートカットを右クリックした場合は「ファイル名をクリップボードにコピー」
は出ません。

できると仮定して、適当なファイルの拡張子をlnkに書き換えてみましたが、正
規表現は正しく働いているように思います。
簡略化すると以下のような感じになると思います。[tab]はタブ文字です。
01/02/03 12:34 56 秀丸.lnk[tab]"c:\folder\秀丸.lnk"
01/02/03 12:34 56 秀丸.txt[tab]"c:\folder\秀丸.txt"
この例ではできました。
grepの場合は行末を\nにしないといけないです。行末の件は次のβで修正します。

[ ]
RE:00329 質問:文字列を含まない行抽出のNo.00330
dszhm さん 07/02/01 12:48
 
>エクスプローラ拡張メニューは使っているのでやってみようとしましたが、シ
>ョートカットを右クリックした場合は「ファイル名をクリップボードにコピー」
>は出ません。
  おかしいですね、私が使用している
    2.5.0.0
  では、出てきますが。

>できると仮定して、適当なファイルの拡張子をlnkに書き換えてみましたが、正
>規表現は正しく働いているように思います。
>簡略化すると以下のような感じになると思います。[tab]はタブ文字です。
>01/02/03 12:34 56 秀丸.lnk[tab]"c:\folder\秀丸.lnk"
>01/02/03 12:34 56 秀丸.txt[tab]"c:\folder\秀丸.txt"
>この例ではできました。
  再試行の結果を報告させていただきます。
  grep で「(現在の内容)」に対して、正規表現、Case無視
  HMJRE.dll V1.80 での結果です。

  1. (?<!\.lnk.*)$
     (?<!^.*\.lnk.*)$
     (?<!^.*\.lnk"?)$
     やはり、私の職場PCの環境では、全行がマッチしたものとして
     表示されます。

  2. (?<!\.lnk.*)\n
     (?<!^.*\.lnk.*)\n
     (?<!^.*\.lnk"?)\n
     .lnkを含む行を除去できました。

[ ]
RE:00330 質問:文字列を含まない行抽出のNo.00331
秀丸担当 さん 07/02/01 13:04
 

>  再試行の結果を報告させていただきます。
>  grep で「(現在の内容)」に対して、正規表現、Case無視

むむむ、grepの話だったのですね。
grepで$がうまくいかないのは分かっています。
一応勘違いしないように、grepではうまくいかないと書いていたつもりだったの
ですが。

>  「検索した文字列を強調」をチェックした検索でヒットしている
>  箇所をみると、行末の空文字列にヒットしているようです。

と書かれていたので、てっきり普通の検索がうまくいっていないと思いました。
普通の検索はうまくいっていると思います。
いろいろお付き合いありがとうございました。

[ ]
RE:00331 質問:文字列を含まない行抽出のNo.00332
dszhm さん 07/02/01 15:03
 
>>  「検索した文字列を強調」をチェックした検索でヒットしている
>>  箇所をみると、行末の空文字列にヒットしているようです。
>
>と書かれていたので、てっきり普通の検索がうまくいっていないと思いました。
  これは、正規表現の転記ミス、などで失敗している可能性を
  考えて、通常の検索で試してみたものでした。

>普通の検索はうまくいっていると思います。
>いろいろお付き合いありがとうございました。
  こちらこそ、対応でお忙しいところ、ありがとうございました。

[ ]