角かっこワイルドカードの大文字と小文字の区別

角かっこワイルドカードの大文字と小文字の区別

通常、bashワイルドカードは大文字と小文字を区別します。

$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips

角かっこを使っても変更されないようです。

$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips

ハイフンを使用しても変更されません。

$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips

しかし、手紙は散らばっています。

$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ echo [b-c]*
beehive-anthem.txt bluray2mkv.pike branch branchcleanup.pike burdayim.pike casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py

これは、ハイフンが「AaBbCcDd」ロケール順序を使用していることを示します。それでは、大文字で始まるすべてのファイルをワイルドカードとして指定する方法はありますか?

ベストアンサー1

Bash 4.3以降には、次のshoptオプションがありますglobasciiranges

~によるとshopt 組み込み GNU のマニュアルページ:

globasciiranges
設定されている場合、パターンマッチング角括弧式(パターンマッチングを参照)で使用される範囲式は、比較を実行するときに既存のCロケールと同様に機能します。つまり、現在のロケールの組み合わせ順序を考慮していないので、「A」と「B」の間では「b」は対照的ではありませんが、ASCII大文字と小文字は一緒に対照されます。

できることがわかりました

$ shopt -s globasciiranges 
$ echo [A-Z]*

無効にしますshopt -u

別の方法は、ロケールをCに変更することです。サブシェルを使用して一時的にこれを実行できます。

$ ( LC_ALL=C ; printf '%s\n' [A-Z]*; )

所望の結果が得られ、サブシェルが完了すると、メインシェルのロケールは以前と同じままです。

別のオプションは、bash shoptオプションと一緒に中括弧拡張を使用しないことです[A-Z]{A..Z}nullglob

このオプションを有効にすると、nullglobパス名拡張中にパターンが一致しない場合、パターン自体の代わりに空の文字列が返されます。
その結果、期待どおりに動作します。

$ shopt -s nullglob;printf '%s\n' {A..Z}*

おすすめ記事