grepとドル記号のエスケープ


31

どのファイルに文字列があるのか​​知りたいです$Id$

grep \$Id\$  my_dir/mylist_of_files

0回を返します。

私は使用しなければならないことを発見しました

grep \$Id$ my_dir/mylist_of_files

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

どうやって2つ目を一致させることができ$、なぜ機能しないの\$Id\$ですか

2番目$が最後の文字であるかどうかは関係ありません。

grep2.9 を使用します。


質問を投稿する前に、Googleを使用しました...

答えを見つけました

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

grep \\ $ test2

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

しかし、なぜgrep \$Id機能するのか、なぜgrep \\$Id\\$機能しないのかはわかりません。

私は少し混乱しています...

回答:


25

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

  1. grepBasic Regular Expressions(BRE)を使用し$、BREの式の最後にある特殊文字です。この結果、$in の2つのインスタンスが$Id$等しくなくなります。最初の文字は通常の文字で、2番目の文字は行末に一致するアンカーです。2番目の$一致をリテラルに$するには、バックスラッシュをエスケープする必要があります(例:)$Id\$。最初のエスケープ$も機能します:\$Id\$、より一貫性があるように見えるので、これが好きです。¹

  2. ここでは、シェルクォートと正規表現バックスラッシュクォートの2つの完全に無関係なエスケープ/クォートメカニズムが動作しています。問題は、正規表現が使用する多くの文字がシェルにとっても特殊であり、その上、正規表現エスケープ文字であるバックスラッシュもシェル引用文字であるということです。これが二重バックスラッシュを含む混乱を頻繁に見る理由です。しかし、シェルクォート正規表現のバックスラッシュは読みにくいのでお勧めしません。

    代わりに、これを行う最も簡単な方法は、最初に正規表現全体をのように単一引用符で囲むこと'regex'です。シングルクォートは、シェルが持つクォートの最も強力な形式です。したがって、正規表現にシングルクォートが含まれていない限り、シェルクォートを心配する必要がなくなり、純粋なBRE構文に集中できます。

したがって、これを元の例に適用して、\$Id\$単一引用符内に正しい正規表現()をスローしましょう。以下はあなたが望むことをするべきです:

grep '\$Id\$' my_dir/my_file

理由\$Id\$は、シェルクォートの削除(より正確なシェルクォートの言い方)が適用された後、表示される正規表現grepはであるためです$Id$。(1.)で説明したように、この正規表現$Idは行の最後でのみリテラルと一致します。これ$は、最初のリテラルがリテラルであり、2番目が特別なアンカー文字であるためです。

¹また、拡張正規表現(ERE)に切り替えた場合、たとえばegrep(またはgrep -E)を使用することにした場合、その$文字は常に特別であることに注意してください。EREでは、行末以降$Id$文字を入力できないため、何にも一致しません。それが唯一の方法です。\$Id\$


3
grepがその1番目のパラメーターを正規表現として解釈しないようにするために、を行うこともできますgrep -F '$Id$'
jfg956

私のシェル(bash 4.3.42)grep '$Id\$' ...grep \$Id\\$ ...作業
nitsas

2
また、これがメイクファイル内のコマンドである場合は$、前に$:を 付けてエスケープする必要もありますgrep '$$Id\$$'stackoverflow.com/a/2382810/2097284
カミーユ・グドゥスネ

-2

$Id$ファイルを検索するには、次を使用できます。grep '\$id*' filename


2
これは、で始まるすべてのものに一致する$idため$idea、たとえばだけでなく、にも一致し$id$ます。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.