回答:
シェルファイル名のグロビングと正規表現は同じ文字の一部を使用し、同様の目的を持っていますが、あなたは正しい、それらは互換性がありません。ファイル名のグロビングは、はるかに強力ではないシステムです。
ファイル名のグロビング:
*
「ゼロ個以上の文字」を意味します
?
「任意の1文字」を意味します
しかし、正規表現では、.*
「ゼロ以上の文字」を意味するために使用する必要があり、.
「任意の1文字」意味します。A ?
は、正規表現ではまったく異なるものを意味します。つまり、先行するRE要素のゼロまたは1つのインスタンスです。
[]
少なくとも単純なケースでは、これを入力しているシステムでは、角括弧()が両方のシステムで同じように動作するようです。これには、POSIX文字クラス(例[:alpha:]
)などが含まれます。ただし、コマンドをさまざまなシステムタイプで動作させる必要がある場合は、文字のリスト(例[abeq]
)や文字の範囲(例:)のような基本的なもの以外のものは使用しないことをお勧めします[a-c]
。
これらの違いは、2つのシステムが単純な場合にのみ直接交換可能であることを意味します。ファイル名の正規表現一致が必要な場合は、別の方法で行う必要があります。find -regex
1つのオプションです。(find -name
ちなみに、glob構文を使用するにも注意してください。)
'%'
ます'*'
。
元のタイトルで表現された質問への回答:
正規表現がファイルのフィルタリングに使用されるものと異なるのはなぜですか?
ファイル名の展開は、ほとんどのオペレーティングシステム(ワイルドカード/ジョーカー文字)にすでに存在していた正規表現よりも前のものであり、後者よりもはるかにシンプルで直感的です。
一方で*.txt
カジュアルなユーザーが容易に理解され、類似は.*\.txt
もっとない言及に、経験豊富なユーザ/プログラマを対象に何かあります^.*\.txt$
...
*.txt
等しくない.*\.txt
、それ.*\.txt$
は.txt
(少なくとも)後に等しい(少なくとも妥当なファイル名のグロビングを前提とする)ことができるためです。おそらく^.*\.txt$
、使用法にも多少依存します。あなたのポイントを証明しますか?