*
を使用してからゼロ以上の前の文字を表すのに対し、 のようなコマンドと一緒に使用すると、すべてのCファイルを見つけるためにgrep
使用されます。*.c
これら2つのケースで使用法の違いが何であるかを教えてくれる人はいますか?ls
ls *.c
*
答え1
シェルファイル名のグロービングそして一般的な表現同じ文字の一部が使用され、同様の目的で使用されますが、正しいです。互換性がありません。ファイル名のグロービングはあまり強力なシステムです。
ファイル名のグロービングから:
*
「0個以上の文字」を意味します。?
「すべての単一文字」を意味します。
ただし、正規表現では、.*
「ゼロ文字以上」を意味し、.
「すべての単一文字」を意味するには、toを使用する必要があります。 Aは?
正規表現では全く異なる意味を持ちます。つまり、前のRE要素のインスタンスが0個または1個あります。
角かっこ([]
)は、私がこの記事を書いているシステムの両方のシステムで同じように動作するようです。少なくとも簡単な場合はそうです。これには、POSIX文字クラス(たとえば)[:alpha:]
が含まれます。つまり、さまざまな種類のシステムで作業するためにコマンドが必要な場合は、文字リスト(たとえば[abeq]
)や文字範囲(など[a-c]
)などの基本以外の項目を使用しないことをお勧めします。
これらの違いは、両方のシステムが単純な場合にのみ直接交換可能であることを意味します。ファイル名の正規表現の一致が必要な場合は、別の方法を使用する必要があります。find -regex
選択です。 (find -name
参考までにglob文法もありますので参考にしてください。)
答え2
元のタイトルで表現された質問に答えるには、次のようにします。
なぜ正規表現は、ファイルをフィルタリングするために使用される式とどう違いますか?
ファイル名拡張子は正規表現よりも前であり、ほとんどのオペレーティングシステム(ワイルドカード/ジョーカー文字)にすでに存在し、後者よりもシンプルで直感的です。
*.txt
一般ユーザーにとっては理解しやすいですが、この.*\.txt
ような内容は経験豊富なユーザー/プログラマーに適しています^.*\.txt$
。