grepコマンドが検索文字列のピリオドを無視するのはなぜですか?

grepコマンドが検索文字列のピリオドを無視するのはなぜですか?

私が使用するコマンドは次のとおりです。

find . -type f -name "*.sql" -exec grep -i -l 'schema_name.' {} +

私が検索したいものはすべて含まれていますschema_name.。しかし、findコマンドは最後のものを無視し、代わりにそれを探し.ます。schema_nameschema_name.

答え1

それはgrep問題です、いいえfind

grepデフォルトでは、正規表現はschema_name.文字列の後のすべての文字を表すパターンを一致させるために使用されますschema_name

ドットを文字通り一致させるには、.バックスラッシュを使用してドットをエスケープする必要があります\

find . -type f -name "*.sql" -exec grep -il 'schema_name\.' {} +

または、-F次のオプションを使用してください。

find . -type f -name "*.sql" -exec grep -Fil 'schema_name.' {} +

答え2

fgrepを使用できます。

find . -type f -name "*.sql" -exec fgrep -i -l 'schema_name.' {} +

おそらく以前のUnix OSでははるかに高速です(fgrep、grep、egrepは3つの異なる実行可能ファイルでしたが、fgrepは正規表現に関連するすべてを完全に省略していたため、はるかに高速です。たとえば、GNUベースのシステムでは、これら3つのプログラムは同じ実行ファイルへのリンクだけです。))。

答え3

検索パターンのエスケープドットgrep

find . -type f -name "*.sql" -exec grep -i -l 'schema_name\.' {} +

答え4

grepコマンドが検索文字列のピリオドを無視するのはなぜですか?

しかし、実際にはそうではありません。

証明するには実行してください。

grep . file

空白行をすべて削除する簡単な方法は次のとおりですfile

つまり、.単一文字(改行を除く)の正規表現原子です。文字通り点を一致させるには、原子を次のようにエスケープする必要があります。\.

関連情報