2017-01-20 10 views
1

私は、多くの場合、テキストを再帰的に探し出すために、grep -r [text]コマンドを使用しています。圧縮されたファイルでもバンドルされています。しかし、「*」式では機能しないことが分かりました。"grep -r"は "*"を受け入れないのはなぜですか?

$ grep -r "*.cert" 

[nothing] 

$ grep -r "ca.cert" 

[entries found] 

文字をエスケープしても役に立ちません。何故ですか?

+1

'grep -r '.cert $''を試してみてください。これにより、 '.cert'で終わるすべてのエントリが得られます。 – sisanared

+0

@sisanaredあなたの提案は、行の最後にしかパターンを見つけることができません。ファイル名が何らかの連続したテキストの場合、パターンは単語の境界で終わらなければなりません: '。* \。cert \> ''。実際には、ファイル名から空白を除外するか、 ".cert"の前に行全体を見つける必要があります。 '[^ [:space:]] * \。cert \>' '(テストされていない)に沿ったものです。ファイル名に空白を含めることはできません。 –

答えて

7

あなたは何とかして正規表現との混乱を招きます。 grepでは、あなたが探している式は正規表現なので、その規則に従わなければなりません。

グローブ時には、*は任意の文字に展開されます。

正規表現を使用する場合、*は、左側のものが何回表示されるかを示す数量化子です。しかし、あなたはそれの左に何も指定していません!

だけで任意の文字を意味する.を使用します。それは文字通りのドットではなくメタ文字であるので

grep -r ".*\.cert" 
#  ^

は、また、どのように私は2番目のドットをエスケープしています参照してください。

+0

リテラルドットを同じロジックでエスケープしたい場合もあります。私はファイルの名前が 'xy.cert'などと仮定します。あなたの提案:はい。 (エスケープがなければ、パターンはおそらく意図していない 'xyzcert'を見つけるでしょう。) –

+0

@ PeterA.Schneiderは実際にはありません。しかし、私はあなたの意見を見ます。たぶん私の答えは '。* \ .cert 'のようなもので、' .cert'の後ろにマッチするものがあればよいでしょう。 – fedorqui

+0

実際に、grepがファイル名を探していて、たとえばgrepが見つからないとします。 ''。* \ .cert \> '' –

1

* nixで真に任意のファイル名を処理することは、不可能なことに突然難しくなります。印象を受けるには:Thisthis同じ著者。

したがって、 "xy.cert"という形式のすべてのファイルを検索する必要がありますが、のみです。私たちは "xycert"または "xy.certificate"を探したくありません。

「.cert」の後ろに空白がないファイル名(たとえば、現代のファイルシステムでは正式なファイル名である「xy.cert my butt」)を想定すると、 '\.cert\>'。これにより、その後に空白を含む ".​​cert"が見つかるか、EOFになります。 \>は単語の終わりを意味するので、 "xy.certificate"は一致しません。

".cert"という名前のファイルが見つからない場合は、私のコメントと同様に'[^[:space:]]+\.cert\>'と言ってください。 (ドットの前にファイル名に少なくとも1つの非空白を入れるために、アスタリスクをプラスに変更しました)そのパターンにはegrepを使用する必要があります。

+0

TL; DR:ストリームまたはテキストで、拡張子が 'cert'のファイル名を見つけるには、' '\ .cert \>' 'を使います。 – fedorqui

+0

@fedorqui正しい;-)。しかし、それを考えて、望ましくない可能性があります - ".cert"という名前のファイルを探したいのですか? –

+1

'egrep'の使用を避けたい場合は' + ':' '[^ [:space:]] \ + \。cert \>' 'をエスケープしてください。 – fedorqui

関連する問題