• ベストアンサー

正規表現 '\(.*\)\.' の意味

目的がファイル名から拡張子を取り除きたいのですが expr `basename hoge.sh ` : '\(.*\)\.' で標準出力の結果が hoge となり目的を達成する事ができました。 しかし  '\(.*\)\.' の意味がよく理解出来なくて悩んでおります。 色々と試してみた結果になりますが expr `basename hoge.sh ` : '\(*\)\.'  .を取ってみた 出力無し expr `basename hoge.sh ` : '\(.*\) .\を取ってみた hoge.sh expr `basename hoge.sh ` : '\(.*\).'  \を取ってみた hoge.s expr `basename hoge.sh ` : '\(...\)\.' ...にした 出力無し expr `basename hoge.sh ` : '\(....\)\.' ....にした hoge 以上、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.4

expr コマンドの 「expr 文字列 : 正規表現」書式で正規表現中で \( \) が使われていた場合は、それに囲まれた範囲が結果として出力されます。このことは、man expr で調べられます。 あとは、 . 任意の文字列、 * 直前の0回以上の繰り返し、 \. ピリオド文字 というのがわかれば、ピリオドの直前までの文字列を取り出すことがわかると思います。 また、拡張子が .sh だということがわかっていれば、 basename hoge.sh .sh でhogeが得られます。

tcpip110
質問者

お礼

ご回答有り難うございます。 > * 直前の0回以上の繰り返し だから expr `basename hoge.sh ` : '\(*\)\.' の時は 直前の文字が無いので( (が有るがこの(はexprとしての特別な書式の為無視される?! )、指定したい文字を表す事が出来ない理由で 出力が無い動作になるのだろうと、何となくですが理解できました。 \( \) 以降の\.ピリオド文字を含めた、 それ以降の文字は不要であると明示している事もわかりました。

その他の回答 (3)

回答No.3

ちなみに \( と \) は一般的な正規表現と違います。 あとは、.* と \. が分かれば理解できると思います。

参考URL:
http://www.linux.or.jp/JM/html/gnumaniak/man1/expr.1.html
tcpip110
質問者

お礼

ご回答有り難うございました。 > ちみに \( と \) は一般的な正規表現と違います。 この事を認識していなかったので 理解する上で糸口となりました。

noname#39970
noname#39970
回答No.2

>調べられない理由って まぁまぁ 当人が解答を得られる手助けをしてあげようよ ということで http://www.google.co.jp/search?q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE&hl=ja&lr=lang_ja

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「正規表現」だってわかっているんだったら検索すればいいと思うんだが. 調べられない理由って何でしょうか?