• 締切済み

正規表現について

どうも納得出来ない動作なので質問させてください。 下記のようにコマンドを打ち込んだとします。 ---------- grep -E ^A.*$Z ファイル名 ---------- ■ファイル内容 Ab3dZ abdddZ AZ 234$Z F****Z ---------- すると「Ab3dZ」と「AZ」が引っかかります。 「.」は任意の一文字、「*」は0回以上の繰り返しをあらわすと認識しております。 そうすると、なぜ「Ab3dZ」が引っかかるのかが良く分かりません。 教えて頂けないでしょうか。 宜しくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.7

「echo ^A.*$Z」と打ち込むと、「^A.*」と表示されます。 「echo ^A.*Z$」と打ち込むと、「^A.*Z$」と表示されます。 「$」の位置で結果が違いました。 これですが、実はシェルが $なんとか というのを変数とみなして展開してるので ^A.* になったり ^A.*Z$ になったりしているのです。 上の例で言うと $Z という変数があると思ってその内容に置き換えているわけですね。 ですから、'' でくくれというように書いたのです。 次に$の位置についてですが、実際にはいくつか流儀があるのですが、 ^A.*$Z のように、末尾以外に $ がくると、正規表現のメタ文字ではなく、 通常のドル記号のように扱われるやり方があります。 ですから、^A.*Z$ というのはAではじまりZで終わる文字列になりますが ^A,*$Z だと、Aで始まり$Z で終わる文字列にマッチすることになります(この場合行の一部分でもかまいませんメタ文字の$が効いてないので)。 正規表現のメタ文字としての . と * の意味をもう一度確認してみてください。

askask777
質問者

お礼

ふだん、あまり正規表現を使わないので、分からない事が結構多いです。 もう一度、正規表現のメタ文字としての . と * の意味を確認してみます。 回答、ありがとうございました。

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.6

echo ^A.*$Z としてみてください。 おそらく ^A.* が表示されると思います。 質問にあるコマンドラインでは、結局これがgrep に渡されています。 で、. も * も「メタキャラクタ」なんですけど、質問者さんはそもそも どういった文字列を検索したくて ^A.*$Z という正規表現を書いたのでしょうか?

askask777
質問者

お礼

「echo ^A.*$Z」と打ち込むと、「^A.*」と表示されます。 「echo ^A.*Z$」と打ち込むと、「^A.*Z$」と表示されます。 「$」の位置で結果が違いました。 ----- 実はテスト問題なんですよね。 教科書には、正規表現の説明箇所で、メタキャラクタと混同しないようにと書いてありました。 ----- 正規表現:直前の文字の0回以上の繰り返し メタキャラクタ:0文字以上の文字または文字列にマッチ ----- 上記のような記述があったのですが、よく理解出来ておりません。 自分の理解では、先頭が「A」で、末尾が「Z」というところまでは認識しています。 どのように理解すれば良いんでしょうか?

すると、全ての回答が全文表示されます。
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

>grep -E ^A.*$Z ファイル名 これ、grepに与えている正規表現を生のままコマンドラインに書いてますよね? grep -E '^A.*$Z' ファイル名 と、シングルクォートでくくってみてください。 echo してみればなにがgrepに渡されてるかわかります。

askask777
質問者

お礼

-----grep -E '^A.*$Z' ファイル名----- 上記を打ち込むと何も表示されません。 echoするとはどうすればいいんでしょうか? すみません、初心者なので、よくやり方がわかりませんでした。

すると、全ての回答が全文表示されます。
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

.* の正規表現は、同じ文字が0個以上という意味ではありません。0個以上の任意の 文字列という意味で、違う文字が混ざっていても差し支えありません。次の正規表現は、 すべての行ににマッチするします。 grep -E '^.*$' ファイル名

askask777
質問者

お礼

確かにすべてにマッチします。 これって、メタキャラクタなんですかね。

すると、全ての回答が全文表示されます。
  • vaidurya
  • ベストアンサー率45% (2714/5983)
回答No.3

*が入っている時点で、Aと$Zが条件になりますね。 行頭のAとZが含まれているのはその二行だけ。 grepは行単位で処理するので $Zの$は無視される仕様なんではないかと思います。 また、検索用のデータにAb3dZaやAZbを加えると それらも該当するわけですが… 条件を^A.*Z$に改めると、Ab3dZaやAZbは除外されます。 同様の問題として^を条件の行頭以外に加えたりした例も試すと 条件文字列の、行頭の^と行末の$は有効だけど それ以外の位置では無視されるようです。たぶん仕様。

askask777
質問者

お礼

「$」は末尾を指しているんですよね? 自分が疑問に感じている所は、「.*」の部分です。 想定している、「.*」が一致するケースですが ----- ■「.」が「a」だったと仮定して ケース1:何も無い(繰り返し0) ケース2:a(繰り返し1) ケース3:aa(繰り返し2) ケースn:aaa…(繰り返しn) ----- だと思うのですが、そうすると「Ab3dZ」が引っかかる理由が分からないのです。なぜなんだろう。

すると、全ての回答が全文表示されます。
  • junkUser
  • ベストアンサー率56% (218/384)
回答No.2

1です。 $ は大文字、小文字無視でした。すみません。

すると、全ての回答が全文表示されます。
  • junkUser
  • ベストアンサー率56% (218/384)
回答No.1

.* が b3d に一致しているからではないでしょうか。 # ^A.*Z$ の間違いかと思ったら ^A.*$Z でも同じ結果になりますね。 # 何?この"$"

すると、全ての回答が全文表示されます。

関連するQ&A

  • 正規表現

    $ grep -E ^a.*$z abc.txt ある書籍の中で、上記のコマンドでマッチする文字列として、 "az"が挙げられているのですが。 "."は一般に任意の1文字と説明されていますが、"az"では"."がゼロ文字として扱われているように思えるのですが。任意の1文字にはゼロ文字も含まれるのでしょうか?

  • 正規表現*について

    LPICレベル1 翔泳社の本を参考にして試験対策をしていますが、p121の0回以上繰り返えす*でab*zでマッチするのが「az」「abz」「abbz」とあります。しかし、「az」はlsコマンドで試してみましたが引っかかりません。 この本が間違っているのでしょうか? シェルはbashを用いています。(REDHAT9) 回答のほどよろしくお願い致します。

  • 正規表現の使い方

    仕事で悩んでいます。 私の仕事はログファイルから、月々何件アクセスしたか調べる仕事です。 コマンドプロンプトでsort、grep、wcなど色々使い方を勉強していくうち、 今度は難しいのが出てきて悩んでいます。 そのまま書き移したら、皆さんは分からないし、会社のプライバシーに関わるので、簡単に書きます。 例えば、 ABC10 ABC10 ZP-22 AB-V5 AA10 PP122 と数字があり、 頭文字のAの部分を集めたいところに私は grep -e "資料番号の頭文字" 入力ファイル > 出力ファイル とコマンドプロンプトで打ち、下記の通りになりました。 AB-V5 AA10 AB-V5 AA10 だが、問題は途中にあるAB-V5は仲間ではないので、 それを省きたいのです。 上記の例は数少ないので手入力でもできますが、実際は1万以上もあるので、 手入力はできません。 上司に聞いたところ、 A[0-9].* の正規表現を使えと言われましたが、 全くやり方わかりません。 正規表現について勉強したのですが、全く理解ができず、仕事が遅れています。 皆さんの知恵を借りたいと思います。 よろしくお願いします。

  • UNIXコマンドのパターンマッチング(grep)について

    *または?(ワイルドカード)のマッチングはできないでしょうか? 例)12345*AB*678 先頭、後部でのマッチングは↓で可能でしたがここで行き詰ってしまいました。 ^grep "12345*" file名 | grep -e "*678" UNIXコマンドを使ってのよい方法があったらご教授ください。 どうぞ宜しくお願いいたします。

  • コーシーの積分公式について

    コーシーの積分公式を使って、f(z)=1/{(z-a)(z-b)}とした ∮f(z) dz を求める過程に違和感を感じるので、誤っているところの指摘をお願いいたします。 f(z)=1/{(z-a)(z-b)}として、 C_ab を極a, bを囲む閉曲線, C_aを極aのみを囲む閉曲線, C_b を極bのみを囲む閉曲線とします。これらの閉曲線の向きはいずれも反時計回りとします。 このとき、極a,bを避けるような周回積分によって(a)式が成り立つと思います。 ∮_C_ab f(z) dz - ∮_C_a f(z) dz - ∮_C_b f(z) dz = 0 …(a) g(z) = 1/(z-a)とすると、 ∮_C_b f(z) = ∮_C_b g(z)/(z-b) dz = 2πi g(b) = 2πi / (b-a) …(b) h(z) = 1/(z-b)とすると、 ∮_C_a f(z) = ∮_C_a h(z)/(z-a) dz = 2πi h(a) = 2πi / (a-b) …(c) よって、 ∮_C_ab f(z) dz - 2πi / (b-a) - 2πi / (a-b) = ∮_C_ab f(z) dz = 0 …(d) となってしまいます。(d)は f(z) の正則性からしてもありえないことだと感じるのですが、どの式変形の途中で誤ってしまったのでしょうか。

  • ファイルからの文字列を検索

    テキストファイルを読み込み、任意の文字列を探すプログラムを作成しました。 これを改良し、ワイルドカード入力をした場合、*をa~zとA~Zに変えて、それぞれで検索しようとしています。ワイルドカードにはいる文字は1文字です。 「a*」と検索すれば「aa」、「ab」~「az」、「aA」、「aB」~「aZ」と検索し、合致したものを出力したいのです。 回答が欲しいとは思いますが、ヒントや考え方など何でも結構ですので、お力添えをお願いいたします。

  • 積分路に不連続点をもつ複素積分

    参考書では, ∫_C f(z) dz を考えるとき, f(z) が C の任意の点で連続であることを仮定しています。 それなのに, f(z) = |z|/z, C : |z - 1| = 1 のとき, ∫_C f(z) dz を求めよ, という問題があって、まったく解けません。 C 上の点 z = 0 において, f(z) は不連続である以前に定義されていません。 こういう問題はどのように解いたらいいのか、考え方とできれば答を教えてください。 よろしくお願いします。

  • 複素積分の問題について。

    複素積分の問題を解いてみたのですが、手元に答えがないうえに合っているか自信がないので、チェックしていただけると助かります。解法に誤りがあったらどうぞ指摘してください。自分の中では、留数の求め方が怪しいです。 以下、積分の経路Cは原点中心半径8の円で正の向きとします。 (1)∫ 1/sin(z) dz (2)∫ 1/(1-cos(z)) dz (3)∫ (1+z)/(1-e^z) dz (4)∫ tan(z) dz (1)∫ 1/sin(z) dz f(z)=1/sin(z) について、f(z) は z=mπ で特異点をとり、特にCの内部では z=0,±π,±2π が特異点となる。 ここで各点における留数を求めると、 Res(0)=1 Res(π)=-1 Res(-π)=-1 Res(2π)=1 Res(-2π)=1 となるので、 ∫ 1/sin(z) dz=2πi(1-1-1+1+1)=2πi (2)∫ 1/(1-cos(z)) dz f(z)=1/(1-cos(z)) について、f(z) は cos(z)=1、つまり z=2mπ で特異点をとり、特にCの内部では z=0,±2π が特異点となる。ここで f(z) を z=0 のまわりで展開すると、 f(z)=1/(1-1/2(z^2)+1/24(z^4)-・・・) =1/(1/2(z^2)-1/24(z^4)+・・・) であることから、Res(0)=0 同様に、Res(π)=0,Res(-π)=0 なので、 ∫1/(1-cos(z)) dz=2πi・0=0 (3)∫ (1+z)/(1-e^z) dz f(z)=(1+z)/(1-e^z) について、f(z) は z=2πim(mは整数)で特異点をとり、とくにCの内部では z=0,±2πi で特異点となる。ここで、 Res(0)=-1 Res(2πi)=-1-2πi Res(-2πi)=-1+2πi となるので、 ∫(1+z)/(1-e^z) dz=2πi(-1-1-2πi-1+2πi)=-6πi (4)∫ tan(z) dz f(z)=tan(z)=sin(z)/cos(z) について、f(z) は z=(2m+1)π/2 で特異点をとり、特にCの内部では z=±π/2、±3π/2,±5π/2 で特異点となる。ここで、 Res(±π/2)=-1 Res(±3π/2)=-1 Res(±5π/2)=-1 となるので、 ∫tan(z) dz=2πi・(-6)=-12πi

  • 複素解析

    授業のプリントの問題で、 I=∫|z-(-i)|=2 e^πz/(z+i)^4 dz という問題があって、グルサーの公式を用いることにより、 I=2πi/3!×3!/2πi∫|z-(-i)|=2 f(z)/(z-(-i))^4 dz ただし、e^πz=f(z)と置いている。 というところまではわかったのですが、この先どうすればよいのかわかりません。お教えください。

  • 積分路

    教えてください! 曲線Cは点z=0を始点、z=2+(i/2)を終点とする任意の曲線である。次の積分の被積分関数はz平面の全域で不定積分をもつことを確かめ、次の積分を求めよ。 (1)∫c (6z+1)dz (2)∫c (eπz乗)dz (3)∫c (cosπz)dz

このQ&Aのポイント
  • いびきをかく人は、自分のいびきで起きることはあるのでしょうか?通常は起きず、うるさく感じることが少ないと言われています。
  • 昼間に他人がいびきをかいていると不快に感じるのは、夜の不快な経験を思い出すからなのでしょうか?それとも、いびき自体が不快な音だからでしょうか?
  • 昼行性の人間がいびきをかいて自分の位置を知らせるのは、大昔危険だったのでは?いびきをかく個体が淘汰される前に、人間は安全に寝られるようになったのでしょうか?
回答を見る