文字列が$Id$のファイルを知りたい。

grep \$Id\$ my_dir/mylist_of_files 

は0回の出現を返します。

使用する必要があることを発見しました

grep \$Id$ my_dir/mylist_of_files

次に、$Idが出力で色付けされている、つまり一致していることがわかります。

どのように一致させることができますか2番目の$となぜ\$Id\$が機能しないのか

2番目の

は最後の文字かどうかです。

grep 2.9を使用します。


前質問を投稿して、Googleを使用しました…

答えを見つけました

test2という名前のファイルで$(ドル記号)を検索するには、次のように入力します。

grep \\ $ test2

\\(二重円記号)文字シェルに\ $(単一の円記号、ドル記号)を渡すように強制するために必要ですgrepコマンドに。 \(単一の円記号)文字は、次の文字(この例では$)を式文字ではなくリテラル文字として扱うようにgrepコマンドに指示します。バックスラッシュなどのエスケープ文字を使用する必要がないように、fgrepコマンドを使用します。

しかし、なぜが機能し、grep \\$Id\\$が機能しない理由

少し混乱しています…

回答

ここには2つの個別の問題があります。

  1. grep 基本正規表現 (BRE)を使用し、$はBREの特殊文字です「は式の最後にのみあります。この結果、$Id$$の2つのインスタンスが等しくなりません。最初の文字は通常の文字で、2番目は行の終わりに一致するアンカーです。2番目の$を文字通りの$それをバックスラッシュでエスケープする必要があります。つまり、$Id\$です。最初の$をエスケープすることもできます:\$Id\$、そしてより一貫性があるように見えるので、これを好みます。¹

  2. ここでは、完全に無関係な2つのエスケープ/クォートメカニズムが機能しています。シェルクォートと正規表現のバックスラッシュクォートです。問題は、正規表現が使用する多くの文字がシェルにも固有であり、それに加えて、正規表現のエスケープ文字であるバックスラッシュもシェルの引用文字であるということです。これが、二重の円記号を含む混乱がよく見られる理由ですが、正規表現を引用するシェルに円記号を使用することはあまり読みにくいため、お勧めしません。

    代わりに、これを行う最も簡単な方法は、最初に"regex"のように、正規表現全体を一重引用符で囲みます。一重引用符は、シェルが持つ最も強力な引用形式です。正規表現に一重引用符が含まれていない限り、シェルの引用を気にする必要がなく、純粋なBRE構文に集中できます。

では、これを元の例に適用して、正しい正規表現(\$Id\$)を一重引用符で囲んでみましょう。次のようにすると、次のようになります。

grep "\$Id\$" my_dir/my_file 

\$Id\$が機能しない理由は、シェル引用符の削除後(シェルのより正しい言い方)引用符)が適用されると、grepが認識する正規表現は$Id$になります。(1。)で説明したように、この正規表現はリテラルの

は、最初の$がリテラルであり、2番目が特別なアンカー文字であるため、行末のみです。

¹拡張正規表現(ERE)に切り替えた場合、たとえば(またはgrep -E)、$文字は常に特別です。 EREでは、$Id$は、行末のに文字を含めることができないため、何にも一致しません。したがって、\$Id\$が唯一の方法です。

コメント

  • grepが最初のパラメーターを正規表現として解釈しないようにするため、grep -F '$Id$'を実行することもできます。
  • シェル(bash 4.3.42)grep '$Id\$' ...およびgrep \$Id\\$ ...動作
  • これがメイクファイル内のコマンドである場合は、$の前に

grep '$$Id\$$' stackoverflow。com / a / 2382810/2097284