grepで正規表現を使うとき、囲み方(「'」or「"」)で解釈が変わるのですか???(解決済み)
解決したいこと
grepで正規表現を使うとき
①"
で囲む
②'
で囲む
③なにも囲むのに使わない
としたとき、正規表現の書き方がかわるのでしょうか???
(@itagagakiさんのおかげで解決いたしました。解説は最後に)
やりたいこと/調べたこと
grepを使って.
という文字列を抽出したいです。
ひとつの表現として、grep ^\\.$
を見かけました。
正規表現初心者の私からしたらまず、^\.$
では?????という気持ちでいっぱいです。
さらに少し調べたら、ある文字をエスケープするためには、"
で囲むときは\
が2個、'
で囲むときは\
が1個必要という記事を見かけました。
https://rcmdnk.com/blog/2013/10/28/computer-bash-linux/
もしかしてgrep ^\\.$
は囲むものがなくて"
が補完されているのかな?だから\
が2個あるのかなと思い、.
を抽出できる書き方を網羅的に試してみました↓↓↓
①^\\.$
②'^\.$'
③"^\\.$"
④"^\.$"
いや……囲まなかったからといって"
が補完されているわけではなさそうです。
じゃあ、"
(③④)はなぜ\
が1個でも2個でもよくて、なにも囲まなかったとき(①)は\
が2個必要なのでしょうか?
解決編
grepの話ではなくてそもそもシェル自体のクォート時の解釈を調べるべきでした。
bashのマニュアル(https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html )のクォートの章を読むと、クォートの有無による\
の解釈の仕方が書かれています。
少しややこしいですが、今回の話にあてはめて考えます。
目標はgrepコマンドに\.
という文字列を渡すこととします。
そのときの\
の必要な数は
クォートなし:最初の「\」は次の文字を保持するために消費されるので、2つ必要
シングルクォート:クォート内の文字はすべて保持されるので1つで良い
ダブルクォート:①クォート内の文字はすべて保持されるので1つで良い
②クォート内であっても「\」の前の「\」は例外的に消費されるため2つでもよい
②クォート内であっても「\」の前の「\」は例外的に消費されるため2つでもよい
このようなルールがあるため、"
で囲った場合は\
は1つでも2つでもいいという不思議なことが起きていたようです。
コメントをくださった@itagagakiさんありがとうございましたm(_ _)m