@reacon4234

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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つでもよい

このようなルールがあるため、"で囲った場合は\は1つでも2つでもいいという不思議なことが起きていたようです。
コメントをくださった@itagagakiさんありがとうございましたm(_ _)m

1 likes

1Answer

Comments

  1. @reacon4234

    Questioner

    回答ありがとうございます!
    頂いた記事とbashのマニュアル(https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html )のクォートの章をよくよく読んでみました
    grepコマンドに「\.」を渡したいという前提で、「\」の必要数は
    クォートなし→最初の「\」は次の文字を保持するために消費されるので、2つ必要
    シングルクォート→クォート内の文字はすべて保持されるので1つで良い
    ダブルクォート→①クォート内の文字はすべて保持されるので1つで良い
            ②クォート内であっても「\」の前の「\」は例外的に消費されるため2つでもよい
    と解釈しました。
    ダブルクォートの時が少し複雑でしたが、とても良い勉強になりました。ありがとうございました!!!

Your answer might help someone💌