grepでの指定の仕方について質問No.01393
EMiCC さん 98/07/21 18:10
 
grepで下記のような行(先頭の3文字が "abc" で、その前の行が
改行だけの行)をさがしたいのですが、

----- ココカラ -----
                    ← 改行だけの行
abcdefg・・・      ← この行をさがしたい
----- ココマデ ----

指定する検索文字列を

\n\nabc

(で当然正規表現をチェック)としても検索できません。
ファイル内検索では同じ検索文字列でヒットするのですが、
なんか指定の仕方が間違っているんでしょうか?
 

[ ]
RE:01393 grepでの指定の仕方について質問No.01394
EMiCC さん 98/07/21 18:52
 

どうすればヒットするのか色々とやってみたところ、よけいわからなくなりました。

^.*$
を検索すれば全ての行にヒットするのは当然なのですが、

^[.]*$
で検索すると改行のみの行にヒットし(しかもgrepだとどの行にもヒットせず)、

^[.]$
だとどの行にも(1charだけの行にも)ヒットしません。

本当は [ JRE32.DLL ] を作った山田和夫氏に聞くのがすじなんでしょうが、
同じように困っている人がいるかも知れないので(いや、いないだろうな、きっと (^_^; )
ここで質問させてもらいました。

なにか根本的なところで理解の仕方が間違っているような気もしてきました。
どなたかわたしに正規表現の仕方を整理して教えて下さい、お願いします。<m(_ _)m>
 

[ ]
RE:01394 grepでの指定の仕方について質問No.01396
番頭++ さん 98/07/21 20:08
 
本来の質問である grep が複数行を、検索結果として扱うかどうかの本来の仕様
は、その作者にしか判りません。個人的 (私) は出来ないと思っています。

「秀丸エディタ」の正規表現は、\ のエスケープ文字が指定されなかったときの
解釈が曖昧 (?) みたいです。よくマクロで \\n を \n と書いてもまともな結果が
得られる場合があります。それなりに「改行」として扱われる場合があります。

>^[.]$
>だとどの行にも(1charだけの行にも)ヒットしません。

これは、「.」を文字として、扱うみたいです。ですから、
^.$ だと、一文字の行をさがします、みたいです。



.
..

^[、。]$ 等は誰が見ても同じ解釈ですよね。

^[.]$ と ^.$ に関しては、[] の処理で、通常の文字として解釈したほうが便利
だとも思われます。うまく表現できませんが ...

^.$ ==> 行頭から、行末の間に一文字ある行をさがす。

^[.]*$ ==> 行頭から、行末の間に一文字「.」(0-n の繰り返し) のある行をさがす。

^[.]$ ==> 行頭から、行末の間に一文字「.」のある行をさがす。

教訓、余計な文字は書かない、すると、その正規表現と使用者の考えが、一致し
ます。あちきみたいな素人は、そんな気がします、です。本当の仕様は作者のみ
知るのでしょうか ...

[ ]
RE:01396 grepでの指定の仕方について質問No.01397
EMiCC さん 98/07/21 21:33
 

番頭++ さん、すばやい回答ありがとうございます。

>解釈が曖昧 (?) みたいです。よくマクロで \\n を \n と書いてもまともな結果が
>得られる場合があります。それなりに「改行」として扱われる場合があります。
あ、これは前から気づいてました。

>教訓、余計な文字は書かない、すると、その正規表現と使用者の考えが、一致し
>ます。
全くその通り。 (^_^;

結論として、複数行の検索はあきらめて、1行での検索結果から1つづつ地道に
本当にさがしたかったものか当たっていくことにしました。
今回は当初の思い通りにはできませんでしたが、そのかわり正規表現について
理解を深めることができました。
本当に有り難うございました。 <m(_ _)m> 感謝感謝。
 

[ ]
RE:01396 grepでの指定の仕方について質問No.01399
杉浦 まさき さん 98/07/22 00:20
 
横から失礼します。
 杉浦 まさき です。

>本来の質問である grep が複数行を、検索結果として扱うかどうかの本来の仕様
>は、その作者にしか判りません。個人的 (私) は出来ないと思っています。

個人的に色々ハッキング(^^;してみた結果、
 秀丸の正規表現検索で検索文字列に改行("\n")を指定した場合、
 JRE32.DLL には
 検索開始位置から数えて「検索文字列中の "\n" の数 + 1」行が
 まとめて送られる、という仕様の様です。
 #その辺は「秀丸Q&A集」の
  「正規表現」の章の最後にコメントしてあります。
 ##で、これって合ってるんでしたっけ?>担当様

で、grep の場合はファイル先頭から始めて、
 その行数分づつ繰り返し送られているだけだとすると、
 その境界にまたがるような物はヒットしないことになります。

とはいえ、他の検索系ツール(grep, sed, awk etc.)も
 改行コードの検索に関しては
 「サポートしていない」か「自前で処理する」かの
 どちらかですから(多分(^^;)、
 秀丸は上の仕様になってるだけでもかなり親切なのかもしれません。


>よくマクロで \\n を \n と書いてもまともな結果が
>得られる場合があります。

うーん、要は JRE32.DLL に "\n" という文字列を送るか
 改行コードをそのまま送るかの違いですよね。
 で、あとは JRE32.DLL が直接改行コードが送られてきた時に
 それをどう解釈してるかですけど…
 なんか「ケース・バイ・ケース」のようですね(^^;。

>>^[.]$
>>だとどの行にも(1charだけの行にも)ヒットしません。
>これは、「.」を文字として、扱うみたいです。ですから、
>^.$ だと、一文字の行をさがします、みたいです。

キャラクタクラス指定子([])の中ではメタキャラクタ(".","*","+" etc.)は
 その意味を失って、単なる文字と解釈されます。
 で、これは正規表現の標準的な仕様だったと思います。

>教訓、余計な文字は書かない、

これが結構難しかったりしますけど(^^;。


[ ]
RE:01399 grepでの指定の仕方について質問No.01403
EMiCC さん 98/07/22 11:21
 

番頭++ さん、杉浦 まさき さん、色々と教えていただいてありがとうございました。

私の勉強不足&調査不足でした。
 


[ ]
RE:01403 grepでの指定の仕方について質問No.01404
番頭++ さん 98/07/22 12:36
 
> で、これは正規表現の標準的な仕様だったと思います。

それが、標準的、一般的みたいですね。

> あ、そうそう(^^;。メタキャラクタはキャラクタクラスの中ではその意味を
> 失って、単にその文字列を表わします ...

「秀丸 Q & A 集」にはこのような表現があります、「文字列」は「文字自身」
という表現が個人的には好きです。

> メタキャラクタがその性格上意味を持ち得ない位置にコードされた場合には、
> 本来の意味を失い、その文字自身を表わす。

> また \ を直前にコードすることによって明示的にメタキャラクタの意味を
> 失わせることもできる。

これは、ある正規表現での説明です。「明示的に意味を失わせる ...」と言うのが
無難な方法かも知れません。

 ^.$ ^[.]$ ^[.]*$ ^[.]+$ ^[\.]*$ は参考になる例でよすね。
特に ^[.]*$ で改行だけの行に、検索がヒットすると、パニックもんです。

[ ]
RE:01404 grepでの指定の仕方について質問No.01413
杉浦 まさき さん 98/07/22 23:38
 
番頭++ さん、こんばんは。
 杉浦 まさき です。

>「秀丸 Q & A 集」にはこのような表現があります、「文字列」は「文字自身」
>という表現が個人的には好きです。

確かにここでの「文字列」という表現はよくないので、
 次のバージョンで修正しておきますm(_ _)m。
 #時間が取れればあの章は全面的に書き直したいんですけど…(^^;。
 ##内容もそうですが、あのフォントの色の使い方が最悪(^^;。


[ ]
RE:01413 grepでの指定の仕方について質問No.01419
番頭++ さん 98/07/23 18:31
 
> #時間が取れればあの章は全面的に書き直したいんですけど…(^^;。
> ##内容もそうですが、あのフォントの色の使い方が最悪(^^;。

今年の初めに「秀丸 Q & A 集」を知りましたです。かなり役に立つ資料だと思
いました。このヘルプと、「秀丸エディタ」マクロのヘルプを同時に見ることが
たまにありますが、その時には、違和感が ... 確かにあります。

5-6 年前にこれがあると、苦労せずに「秀丸エディタ」を理解できたのですが。
参考資料が充実することは、有り難いことです。

[ ]