bash
80年代後半に最初に設計されたのksh
は、csh / tcshのインタラクティブ機能を備えたの部分的なクローンです。
グロビングの起源は、それが構築する初期のシェルに見られる必要があります。
ksh
それ自体はBourneシェルの拡張です。Bourneシェル自体(1979年にUnix V7で最初にリリースされた)は最初からクリーンな実装でしたが、Thompsonシェル(V1のシェル-> V6)から完全に逸脱したわけではなく、Masheyシェルの機能が組み込まれていました。
特に、コマンド引数はまだ空白で区切られており、|
現在は新しいパイプ演算子ですが^
、代替としてサポートされています(また、そう[!a-z]
しない理由も説明しています[^a-z]
)$1
は、スクリプトの最初の引数であり、バックスラッシュは依然としてエスケープ文字でした。そのため、正規表現演算子(^\|$
)の多くは、シェルで独自の特別な意味を持っています。
Thompsonシェルは、グロビングのために外部ユーティリティに依存していました。sh
引用符で囲まれていない*
、[
または?
sがコマンドで見つかった場合、コマンドはからまで実行されglob
ます。
rm *.txt
グロブを実行することになります:
["glob", "rm", "*.txt"]
そしてglobはrm
、そのパターンに一致するファイルのリストで実行されることになります。
grep a.\*b *.txt
次のように実行さglob
れます:
["glob", "grep", "a.\252b", "*.txt"]
*
上記の防止、その性質上、8番目のビットを設定することにより引用されているglob
ワイルドカードとして扱うから。glob
次に、を呼び出す前にそのビットを削除しますgrep
。
正規表現で同等のことを行うには、次のようになります。
regexp rm '\.txt$'
または:
regexp rm '^[^.].*\.txt$'
ドットファイルを除外します。
演算子がシェルの特殊文字を兼ねているため、演算子をエスケープする必要があるため、.
ファイル名に共通する正規表現演算子は、ファイル名を一致させるのにあまり適しておらず、初心者には複雑です。ほとんどの場合、必要なのは、1つ()または任意の数()の文字を置き換えることができるワイルドカードだけです。?
*
現在、異なるシェルは異なるグロビング演算子を追加しました。現在、kshとzshグロブ(およびbash -O extglob
kshグロブのサブセットを実装するある程度)は、ファイル名と現在のシェル構文で使用するのに煩わしくない構文を持つregexpと機能的に同等です。たとえば、zsh
(extendedglob拡張を使用して)では、次のことができます。
echo a#.txt
のa
後に続くで構成されるファイル名に一致する可能性がある場合(そうではない).txt
。より簡単ですecho (^a*\.txt$)
(ここでは、シェルがそれを処理する1つの方法であったシェルオペレーターから正規表現演算子を分離する方法として中かっこを使用しています)。
echo (foo|bar|<1-20>).(#i)mpg
ベース名がfoo、bar、または1から20までの10進数であるmpgファイル(大文字と小文字は区別されません)の場合...
ksh93
正規表現(基本、拡張、perlライク、または「拡張」)をグロブに組み込むこともできるようになり(かなりバグが多い)、グロブと正規表現(printf %R
、printf %P
)間の変換ツールも提供されます。
echo ~(Ei:.*\.txt)
持つファイルTXT(非隠された)と一致するようにE小文字は区別、正規表現をXtendedでは、私は nsensitively。
rm -- ^[^.].*\.txt$
代わりに行うことを検討しrm -- *.txt
ますか?