回答:
正規表現とファイル名のグロビングは、2つの非常に異なるものです。
正規表現は、テキストのパターンマッチングのコマンド/関数で使用されます。たとえば、のパターンパラメータgrep
、またはプログラミング言語で。
ファイル名のグロビングは、ワイルドカードを使用してファイル名とディレクトリ名を一致させるためにシェルによって使用されます。グロビングの機能はシェルに依存します。たとえば、Bashは次のようなワイルドカードをサポートしています。
*
0個以上の文字に一致?
1文字に一致[...]
指定されたセットの文字に一致しますこれらのワイルドカードは正規表現に似ているように見えますが、実際に[...]
はグロビングと正規表現で同じ意味を持っています。しかし、グロビングと正規表現では異なること*
を?
意味します。
あなたが書いたコメントで:
しかし、インタープリターはどのように違いますか*ジョーカーか正規表現か?例えば:
grep a*b a*.txt
?
簡単です。並べ替え。
まず、シェルはファイル名と一致するワイルドカードを解釈しようとします。「a」で始まり「b」で終わるファイルがある場合、シェルはa*b
一致するファイル名に置き換えます。同じことが当てはまりますa*.txt
。一致するファイル名がない場合、シェルはgrep
文字通り引数を渡します。
ただし、の最初のパラメーターはgrep
パターンでなければなりません。実際の使用例の99.999%では、最初のパラメーターがシェルによって解釈されることは望ましくありません。だからおそらく最も意図はこれでした:
grep "a*b" a*.txt
引用のおかげa*b
で、シェルはグロビングを使用して解釈せず、代わりに直接渡しgrep
ます。次に、grep
それを正規表現として(設計により)解釈します。
要約すると、シェルは、ワイルドカードを使用している独自のグロビング言語に従ってコマンドラインを解釈します。コマンド、プログラムは、作成者が設計した方法でパラメーターを解釈します。
ファイル名が文字列の場合、ファイル名にも正規表現を使用できます。たとえば、正規表現に一致するファイル名を検索する場合は、次を試してください。
find ./ -regex '.*[abc][xyz].*'
このコマンドは、名前にa、bまたはcがあり、その後にx、yまたはzが続くファイルを探します。これはほんの一例です。無限の可能性があります。
find ./ -name 'a*'
場合は、ワイルドカードとして* を使用します。を入力するときfind ./ -regex 'a*'
、正規表現で*を使用します。重要な違いはスイッチ-name
または-regex
です。