どのファイルに文字列があるか知りたいです$Id$
。
grep \$Id\$ my_dir/mylist_of_files
ゼロ回の発生を返します。
使用する必要があることがわかりました
grep \$Id$ my_dir/mylist_of_files
$Id
次に、出力で色が指定されていることを確認します。つまり、一致しました。
2番目のものをどのように一致させることができ、$
なぜ機能しないのですか\$Id\$
?
$
2 番目の文字が最後の文字かどうかは重要ではありません。
2.9を使用していますgrep
。
質問を投稿する前にGoogleを使用しました。
test2というファイルから$(ドル記号)を検索するには、次のように入力します。
grep \\$ test2
シェルが \$ (単一バックスラッシュ、ドル記号) を grep コマンドに渡すようにするには、 \\ (二重バックスラッシュ) 文字を使用する必要があります。 \(単一バックスラッシュ)文字は、grepコマンドに次の文字(この例では$)を式文字ではなくリテラル文字として扱うように指示します。エスケープ文字(バックスラッシュなど)を使用したくない場合は、fgrepコマンドを使用してください。
grep \$Id
しかし、なぜ動作するのか、なぜgrep \\$Id\\$
動作しないのかわかりません。
少し混乱しています...
答え1
これには2つの別々の問題があります。
grep
使用基本正規表現(BRE) は、$
BRE で式の末尾にのみ表示される特殊文字です。その結果、$
inの2つのインスタンスは$Id$
同じではありません。 1つ目はプレーン文字で、2つ目は行末と一致するアンカーです。 2番目の$
一致をリテラルにするには、$
バックスラッシュを使用してエスケープする必要があります。つまり、$Id\$
最初の一致をエスケープする$
ことも可能です。\$Id\$
私はこれがより一貫して見えるので好む。これにはまったく関係のない2つのエスケープ/引用メカニズムがあります。つまり、シェル引用と正規表現バックスラッシュ引用です。問題は、正規表現に使用される多くの文字がシェルにも特殊で、正規表現エスケープ文字(バックスラッシュ)もシェル引用文字であることです。これが二重バックスラッシュに関連する混乱を頻繁に見る理由です。ただし、シェルで正規表現を引用するときは、バックスラッシュは読みにくいので使用しないことをお勧めします。
代わりに、最も簡単な方法は最初に正規表現全体を一重引用符で囲むことです
'regex'
。一重引用符はシェルで最も強力な引用符形式であるため、正規表現に一重引用符が含まれていない限り、必要はありません。もはやシェルの引用を心配するのではなく、純粋なBRE構文に集中することができます。
\$Id\$
したがって、これを元の例に再適用して、単一引用符の中に正しい正規表現()を入れてみましょう。次は必要な作業を行う必要があります。
grep '\$Id\$' my_dir/my_file
\$Id\$
これがうまくいかないのは、シェル引用符の削除(シェル引用のより正確な方法)を適用した後に表示される正規表現は、grep
($Id$
1.)で述べたように、この正規表現は行末$Id
のテキストにのみ一致するためです。 1つ目$
はテキストで、2つ目は特殊なアンカー文字だからです。
また、拡張正規表現(ERE)に切り替えた場合egrep
(またはgrep -E
)を使用することを決定した場合、その$
文字は常に特別です。文字を持つことができないため、EREの$Id$
どれとも一致しません。後ろに行が終わると\$Id\$
唯一の方法になります。
答え2
$Id$
ファイル内で検索するには、次のものを使用できます。grep '\$id*' filename