私が使用するコマンドは次のとおりです。
find . -type f -name "*.sql" -exec grep -i -l 'schema_name.' {} +
私が検索したいものはすべて含まれていますschema_name.
。しかし、findコマンドは最後のものを無視し、代わりにそれを探し.
ます。schema_name
schema_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
。
つまり、.
単一文字(改行を除く)の正規表現原子です。文字通り点を一致させるには、原子を次のようにエスケープする必要があります。\.