なぜ
grep e\\.g\\. <<< "this is an e.g. wow"
そして
grep e\.g\. <<< "this is an e.g. wow"
同じことをしますか?
3番目のスラッシュを追加すると、同じ結果が得られます。しかし、4番目のスラッシュを追加するとすぐには機能しません。これは以前のコース試験の問題に関連しています。 2つのバックスラッシュがある項目に「eg」として行を出力できるかどうかを尋ねます。最初はうまくいかないと思いましたが、うまくいくかどうかを確認しようとしました。説明は何ですか?
ベストアンサー1
まず、単一のスラッシュ一致が多すぎます。
$ echo $'eegg \n e.g.' | grep e\.g\.
eegg
e.g.
ハン吹くこれに関する逃避期間は刑期間と同じです。 Bashは次に期間を渡します。grep。 grepの場合、ピリオドは何でも一致できます。
それでは、次の点を考えてみましょう。
$ echo $'eegg \n e.g.' | grep e\\.g\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\.g\\\.
e.g.
$ echo $'eegg \n e.g.' | grep e\\\\.g\\\\.
$
Bashは二重スラッシュを見つけたら、それを単一のスラッシュに減らしてgrepに渡します。上記の3つのテストの最初のものでは、予想どおりにピリオドの前に単一のスラッシュが表示されます。したがって、これが正しいことです。
トリプルスラッシュを使用すると、Bashは最初の2つのスラッシュを単一のスラッシュに減らします。それからそれを見た\.
。エスケープされたピリオドは Bash に特別な意味がないため、通常のピリオドに簡略化されます。その結果、私たちが望むように、grepはピリオドの前にスラッシュを見ます。
4つのスラッシュを使用すると、Bashは各スラッシュのペアを単一のスラッシュに減らします。 Bashはgrepに2つのスラッシュとピリオドを渡します。 grepは2つのスラッシュと1つのピリオドを見て、2つのスラッシュを単一のスラッシュに減らします。言葉減らす入力にスラッシュの後に文字がない場合、一致するものはありません。
最後に、一重引用符内のすべての文字はリテラルであることを覚えておいてください。したがって、次の3つの入力行がある場合、grepコマンドは入力にリテラルスラッシュがある行のみを一致させます。
$ echo 'eegg
e.g.
e\.g\.' | grep e\\\\.g\\\\.
e\.g\.
Bash 動作の概要
Bashの場合、ルールは次のとおりです。
2つのスラッシュが1つのスラッシュに減ります。
一般文字(ピリオドなど) 前のスラッシュは一般文字(ピリオド)のみです。
したがって:
$ echo \. \\. \\\. \\\\.
. \. \. \\.
これらすべての混乱を避ける簡単な方法があります。 Bashコマンドラインでは、正規表現は一重引用符で囲む必要があります。一重引用符内で、Bashはすべてを保持します。
$ echo '\. \\. \\\. \\\\.' # Note single-quotes
\. \\. \\\. \\\\.