- 締切済み
正規表現について
どうも納得出来ない動作なので質問させてください。 下記のようにコマンドを打ち込んだとします。 ---------- grep -E ^A.*$Z ファイル名 ---------- ■ファイル内容 Ab3dZ abdddZ AZ 234$Z F****Z ---------- すると「Ab3dZ」と「AZ」が引っかかります。 「.」は任意の一文字、「*」は0回以上の繰り返しをあらわすと認識しております。 そうすると、なぜ「Ab3dZ」が引っかかるのかが良く分かりません。 教えて頂けないでしょうか。 宜しくお願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
「echo ^A.*$Z」と打ち込むと、「^A.*」と表示されます。 「echo ^A.*Z$」と打ち込むと、「^A.*Z$」と表示されます。 「$」の位置で結果が違いました。 これですが、実はシェルが $なんとか というのを変数とみなして展開してるので ^A.* になったり ^A.*Z$ になったりしているのです。 上の例で言うと $Z という変数があると思ってその内容に置き換えているわけですね。 ですから、'' でくくれというように書いたのです。 次に$の位置についてですが、実際にはいくつか流儀があるのですが、 ^A.*$Z のように、末尾以外に $ がくると、正規表現のメタ文字ではなく、 通常のドル記号のように扱われるやり方があります。 ですから、^A.*Z$ というのはAではじまりZで終わる文字列になりますが ^A,*$Z だと、Aで始まり$Z で終わる文字列にマッチすることになります(この場合行の一部分でもかまいませんメタ文字の$が効いてないので)。 正規表現のメタ文字としての . と * の意味をもう一度確認してみてください。
- sakusaker7
- ベストアンサー率62% (800/1280)
echo ^A.*$Z としてみてください。 おそらく ^A.* が表示されると思います。 質問にあるコマンドラインでは、結局これがgrep に渡されています。 で、. も * も「メタキャラクタ」なんですけど、質問者さんはそもそも どういった文字列を検索したくて ^A.*$Z という正規表現を書いたのでしょうか?
お礼
「echo ^A.*$Z」と打ち込むと、「^A.*」と表示されます。 「echo ^A.*Z$」と打ち込むと、「^A.*Z$」と表示されます。 「$」の位置で結果が違いました。 ----- 実はテスト問題なんですよね。 教科書には、正規表現の説明箇所で、メタキャラクタと混同しないようにと書いてありました。 ----- 正規表現:直前の文字の0回以上の繰り返し メタキャラクタ:0文字以上の文字または文字列にマッチ ----- 上記のような記述があったのですが、よく理解出来ておりません。 自分の理解では、先頭が「A」で、末尾が「Z」というところまでは認識しています。 どのように理解すれば良いんでしょうか?
- sakusaker7
- ベストアンサー率62% (800/1280)
>grep -E ^A.*$Z ファイル名 これ、grepに与えている正規表現を生のままコマンドラインに書いてますよね? grep -E '^A.*$Z' ファイル名 と、シングルクォートでくくってみてください。 echo してみればなにがgrepに渡されてるかわかります。
お礼
-----grep -E '^A.*$Z' ファイル名----- 上記を打ち込むと何も表示されません。 echoするとはどうすればいいんでしょうか? すみません、初心者なので、よくやり方がわかりませんでした。
- kumoz
- ベストアンサー率64% (120/185)
.* の正規表現は、同じ文字が0個以上という意味ではありません。0個以上の任意の 文字列という意味で、違う文字が混ざっていても差し支えありません。次の正規表現は、 すべての行ににマッチするします。 grep -E '^.*$' ファイル名
お礼
確かにすべてにマッチします。 これって、メタキャラクタなんですかね。
- vaidurya
- ベストアンサー率45% (2714/5983)
*が入っている時点で、Aと$Zが条件になりますね。 行頭のAとZが含まれているのはその二行だけ。 grepは行単位で処理するので $Zの$は無視される仕様なんではないかと思います。 また、検索用のデータにAb3dZaやAZbを加えると それらも該当するわけですが… 条件を^A.*Z$に改めると、Ab3dZaやAZbは除外されます。 同様の問題として^を条件の行頭以外に加えたりした例も試すと 条件文字列の、行頭の^と行末の$は有効だけど それ以外の位置では無視されるようです。たぶん仕様。
お礼
「$」は末尾を指しているんですよね? 自分が疑問に感じている所は、「.*」の部分です。 想定している、「.*」が一致するケースですが ----- ■「.」が「a」だったと仮定して ケース1:何も無い(繰り返し0) ケース2:a(繰り返し1) ケース3:aa(繰り返し2) ケースn:aaa…(繰り返しn) ----- だと思うのですが、そうすると「Ab3dZ」が引っかかる理由が分からないのです。なぜなんだろう。
- junkUser
- ベストアンサー率56% (218/384)
1です。 $ は大文字、小文字無視でした。すみません。
- junkUser
- ベストアンサー率56% (218/384)
.* が b3d に一致しているからではないでしょうか。 # ^A.*Z$ の間違いかと思ったら ^A.*$Z でも同じ結果になりますね。 # 何?この"$"
お礼
ふだん、あまり正規表現を使わないので、分からない事が結構多いです。 もう一度、正規表現のメタ文字としての . と * の意味を確認してみます。 回答、ありがとうございました。