`grep fil *`が失敗するのはなぜですか?


9

私はecho file|grep fil*失敗を見つけましたが、echo abcd|grep abc*成功しました。

理解できません、誰か説明できますか?


システムとgrepのバージョンを追加できますか?これは、gnugrep 2.16(Ubuntu 14.04 LTSのもと)ではエラーが発生せず(終了コード0)、最初の3文字と一致するためです。たとえば、e とecho file|grep fil*答えますfil
Hastur

3
@Hasturこの問題は、正規表現の前のファイル名の展開が原因です。私の作業ディレクトリには、プレフィックスがfilのファイルが含まれていますが、プレフィックスがabcのファイルは含まれていないため、fil *はファイル名に置き換えられますが、abc *は変更されません。
tmpbin

ありがとう考えなかった 私が自分の試みをするとき、私は新しいディレクトリでそれらを試します...
Hastur

回答:


31

この例には2つの問題があります。

主なものは、正規表現が「任意の文字列」を意味するワイルドカードであるglobパターンと同じように機能すると想定していることです*。正規表現で*は、代わりに「前のアトムの任意の数」をfil*意味します。したがってfiその後に0個以上のl文字が続くことを意味します。grep fil.*意図した意味を得るために言う必要があります:.は「任意の1文字.*」を意味するため、「任意の文字シーケンス」を意味します。

より少ない問題は、引用符で囲まれていない特殊文字を使用していることです。これは、globルールの下で何かを意味します。これは、シェルがそれらを解釈できることを意味します。ローカルディレクトリにglobパターンfil*またはabc*と一致するファイルがある場合、シェルはそれらを展開しgrep展開されたファイル名を意図したREではなくパターンとして取得します。コマンドラインでそのような文字を使用しているときはいつでも、それらを引用する必要があります:echo file | grep 'fil.*'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.