Wildcards
萬用字元/萬用字元:字元範圍有問題嗎?
在Linux 命令行中,William Shotts 聲稱字元範圍可能存在問題。請參閱下面的相關摘錄,重點是我的。
字元範圍
如果您來自另一個類 Unix 環境或正在閱讀有關此主題的其他書籍,您可能遇到過
[A-Z]
和[a-z]
字元範圍表示法。這些是傳統的 Unix 符號,也適用於舊版本的 Linux。它們仍然可以工作,但您必須小心使用它們,因為除非配置正確,否則它們不會產生預期的結果。現在,您應該避免使用它們,而是使用字元類。他最後幾句話在說什麼?POSIX 標準對此有何評論?
這很可能是指具有交替排列的大寫和小寫字元的語言環境,而不是第一個,然後是另一個:
$ echo "$LANG" en_US.UTF-8 $ touch a A z Z $ ls A Z a z $ bash -c 'echo [a-z]' a A z
但是,適當的字元類有效:
$ bash -c 'echo [[:lower:]]' a z
但也可能不僅僅是
a
匹配z
:$ LANG=fi_FI.UTF-8 $ touch ä Ä ö Ö $ bash -c 'echo [[:lower:]]' a z ä ö
如果你想避免這種情況,並且只匹配英文小寫字母
a
,z
Bash 特別有一個選項來解釋 ASCII 順序中的範圍:$ bash -c 'shopt -s globasciiranges; echo [a-z]' a z
而且您始終可以強制使用預設的整理順序:
$ LC_COLLATE=C bash -c 'echo [a-z]' a z
至於 POSIX 所說的,在我看來,括號表達式中的範圍在預設 POSIX 之外的語言環境中未定義。模式匹配描述是指括號表達式的正則表達式描述,它說:
在 POSIX 語言環境中,範圍表達式表示位於歸類序列中兩個元素之間的歸類元素集,包括兩個元素。在其他語言環境中,範圍表達式具有未指定的行為:嚴格符合的應用程序不應依賴範圍表達式是否有效,或匹配的排序元素集。