私は、多くの場合、テキストを再帰的に探し出すために、grep -r [text]
コマンドを使用しています。圧縮されたファイルでもバンドルされています。しかし、「*」式では機能しないことが分かりました。"grep -r"は "*"を受け入れないのはなぜですか?
$ grep -r "*.cert"
[nothing]
$ grep -r "ca.cert"
[entries found]
文字をエスケープしても役に立ちません。何故ですか?
私は、多くの場合、テキストを再帰的に探し出すために、grep -r [text]
コマンドを使用しています。圧縮されたファイルでもバンドルされています。しかし、「*」式では機能しないことが分かりました。"grep -r"は "*"を受け入れないのはなぜですか?
$ grep -r "*.cert"
[nothing]
$ grep -r "ca.cert"
[entries found]
文字をエスケープしても役に立ちません。何故ですか?
あなたは何とかして正規表現との混乱を招きます。 grep
では、あなたが探している式は正規表現なので、その規則に従わなければなりません。
グローブ時には、*
は任意の文字に展開されます。
正規表現を使用する場合、*
は、左側のものが何回表示されるかを示す数量化子です。しかし、あなたはそれの左に何も指定していません!
だけで任意の文字を意味する.
を使用します。それは文字通りのドットではなくメタ文字であるので
grep -r ".*\.cert"
# ^
は、また、どのように私は2番目のドットをエスケープしています参照してください。
リテラルドットを同じロジックでエスケープしたい場合もあります。私はファイルの名前が 'xy.cert'などと仮定します。あなたの提案:はい。 (エスケープがなければ、パターンはおそらく意図していない 'xyzcert'を見つけるでしょう。) –
@ PeterA.Schneiderは実際にはありません。しかし、私はあなたの意見を見ます。たぶん私の答えは '。* \ .cert 'のようなもので、' .cert'の後ろにマッチするものがあればよいでしょう。 – fedorqui
実際に、grepがファイル名を探していて、たとえばgrepが見つからないとします。 ''。* \ .cert \> '' –
* nixで真に任意のファイル名を処理することは、不可能なことに突然難しくなります。印象を受けるには:Thisとthis同じ著者。
したがって、 "xy.cert"という形式のすべてのファイルを検索する必要がありますが、はのみです。私たちは "xycert"または "xy.certificate"を探したくありません。
「.cert」の後ろに空白がないファイル名(たとえば、現代のファイルシステムでは正式なファイル名である「xy.cert my butt」)を想定すると、 '\.cert\>'
。これにより、その後に空白を含む ".cert"が見つかるか、EOFになります。 \>
は単語の終わりを意味するので、 "xy.certificate"は一致しません。
".cert"という名前のファイルが見つからない場合は、私のコメントと同様に'[^[:space:]]+\.cert\>'
と言ってください。 (ドットの前にファイル名に少なくとも1つの非空白を入れるために、アスタリスクをプラスに変更しました)そのパターンにはegrep
を使用する必要があります。
'grep -r '.cert $''を試してみてください。これにより、 '.cert'で終わるすべてのエントリが得られます。 – sisanared
@sisanaredあなたの提案は、行の最後にしかパターンを見つけることができません。ファイル名が何らかの連続したテキストの場合、パターンは単語の境界で終わらなければなりません: '。* \。cert \> ''。実際には、ファイル名から空白を除外するか、 ".cert"の前に行全体を見つける必要があります。 '[^ [:space:]] * \。cert \>' '(テストされていない)に沿ったものです。ファイル名に空白を含めることはできません。 –