web-dev-qa-db-ja.com

正規表現VSファイル名のグロビング

正規表現は文字と文字列でのみ使用されることを知っていますが、ファイル名でそれらを見つけることがあります。私の質問は次のとおりです。正規表現onlyは文字またはファイル名でも使用されますか?

14
Hamza

正規表現とファイル名のグロビングは、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はそれを正規表現として(設計により)解釈します。

要約すると、シェルは、ワイルドカードを使用している独自のグロビング言語に従ってコマンドラインを解釈します。コマンド、プログラムは、作成者が設計した方法でパラメーターを解釈します。

19
janos

ファイル名が文字列の場合、ファイル名にも正規表現を使用できます。たとえば、正規表現に一致するファイル名を検索する場合は、次を試してください。

find ./ -regex '.*[abc][xyz].*'

このコマンドは、名前にa、bまたはcがあり、その後にx、yまたはzが続くファイルを探します。これはほんの一例です。無限の可能性があります。

4
nobody