Bashで正規表現を練習するときは、括弧内の完全なセット/検索パターンを一致させようとします。
代わりに、その中のすべての文字を一致させます。
例えば、
cd
touch a.c a.h a.o a.cho
ls *.[cho]
マッチls
:
a.c
a.h
a.o
しかし、の完全なコレクションと一致しませんa.cho
。
セット全体が一致しないのはなぜですか。どうすればよいですか?
答え1
ここでは、正規表現を使用せずにファイル名のグロービングパターンを使用します。
単一文字のみが一致するため(ファイル名ワイルドカードパターンと正規表現の間で同じです)、3文字(「と」のいずれかを意味)[...]
と一致しません。cho
[cho]
c
h
o
useで始まるすべてのa.
名前と一致しますa.*
。
、またはで終わるすべての名前を一致させるには、まずa.
シェルオプションをに設定して使用します。c
h
o
cho
extglob
shopt -s extglob
a.@([cho]|cho)
このような中括弧拡張はa.{c,h,o,cho}
コマンドラインにファイル名を生成しますが、ファイルが実際に存在するという保証はありません。
答え2
バッシュが使えますサポート拡張これはいいえパターンですが文字列リスト
ls *.{c,h,o,cho}
シェル拡張今後ls コマンドは次のように実行されます。
ls *.c *.h *.o *.cho
中かっこ拡張はファイル名拡張の前に発生するため、中かっこ内に glob パターンを入れることができます。
ls *.{[cho],cho}