文件通配符
包含 ‘?’, ‘*’ 或 ‘[‘ 字符的字符串稱為通配符模板(wildcard pattern).形成路徑名(globbing)指一種操作,把通配符模板展開為匹配該串的路徑名.匹配定義為:
不在 括弧中的‘?’匹配任意單個字符。
不在方括弧中的‘*’匹配任意字符串,包括空串。
1、字符集 (Character classes)
對于表達式`[…]’,如果在第一個 ‘[‘ 符后面出現的第一個字符不是 ‘!’, 則該表達式 匹配任意一個在 `[…]’ 內出現的字符.方括弧內不能有空串,因此 ‘]’ 可以作為第一個字符出現在方括弧內. (像這樣, ‘[][!]’ 匹配下列三個字符中的任意一個, ‘]’, ‘[‘ 和 ‘!’.)
1.1、范圍集 (Ranges)
字符集有一個特例:用 ‘-‘ 分開的兩個字符表示一個范圍集.(像這樣, `[A-Fa-f0-9]’ 等于 `[ABCDEFabcdef0123456789]’.)把 ‘-‘ 放到方括弧內的開頭或最后可以獲得它的本意. (像 這樣, `[]-]’ 匹配‘]’和‘-‘ 中任意一個.而 `[-./]’ 匹配 `-‘, `.’ 和`/’中 任意 一個.)
1.2、補集 (Complementation)和特殊含義字符的本意表達
表達式 ‘[!…]’ 表示一個字符,該字符不匹配方括弧內去掉開頭 ‘!’ 后的表達式. (像 這樣, `[!]a-]’ 匹配除了 ‘]’, ‘a’ 和 ‘-‘ 的任意一個字符.)
要去掉 ‘?’, ‘*’ 和 ‘[‘ 的特殊含義,可以通過前面加一個反斜杠;或者在shell命令行中,通過引號來引用這些字符.在方括弧內這些字符顯露出本意,所以, ‘[[?*\]’ 匹配 這 四個字符 中的一個: ‘[‘,’?’, ‘*’, ‘\’.
2、路徑名 (PATHNAME)
形成路徑名功能應用于路徑中的每一個成員部分.路徑中的 ‘/’ 不能被通配符‘?’ 或 ‘*’, 或范圍集匹配
如 ‘[.-0]’ 匹配.范圍集不能直接包含 ‘/’, 否則 導致 語法錯誤.
如果待匹配的文件名以‘.’開頭,那么這個 ‘.’ 字符必須直接給出. (比如說, ′rm *’ 不會刪除 ‘.profile’ 文件, ‘tar c *’ 不會打包你的所有文件;用 ‘tar c .’ 會更好.)
3、空列表 (EMPTY LISTS)
上述的簡單優雅規則,把通配符模板展開為匹配的路徑名,來源于最初的UNIX定義.它允許展開出空串。
例如xv -wait 0 *.gif *.jpg這里可能沒有 *.gif 文件(而且不算錯誤).然而, POSIX 要求句法錯誤或路徑名列表為空時,保留通配符模板不變.(即不展開)
4、正則表達式和通配符的區別
正規表達式 (Regular expressions)
注意,通配符模板不是正規表達式,盡管它們有點象.首先,它匹配文件名,而不是正文;其次,規則不一樣,例如正規表達式里的 ‘*’ 代表零個或多個前面內容的重復.正規表達式的方括弧表達式用 ‘^’ 引導取反操作, (而不是 ‘[!…]’). POSIX 聲明, 在通配符模板中, ‘[^…]’ 未做定義.
5、字符集和國際化(Character classes and Internationalization )
當然,范圍集最初指ASCII的范圍,因此 ‘[ -%]’ 意思是 ‘[ !”#$%]’, ‘[a-z]’ 指所有小寫字符.
一些UNIX實現把這個歸納為:范圍 X-Y 指 X 的編碼到 Y 的編碼之間的編碼字符. 可是,這要求用戶知道他們本地系統的字符編碼,此外,如果本地的字母表順序和字符集順序不對應,那就更不方便了.
因此, POSIX 對通配符模板和正規表達式的方括弧表達法作了重大擴展,上面我們知道了方括弧表達式中的三個類型,它們是取補集(i)、直接列出的單個字符(i)和范圍集(ii).
POSIX 對范圍集在國際化方面作了更有力的說明,并且增加了三個類型:
(ii) 范圍 X-Y 由 X 和 Y 之間所有的字符組成(包括X和Y), X 和 Y 的 當前編碼序列由當前場合的 LC_COLLATE 分類定義
(iv) 命名字符集,
象:
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
因此可以用 ‘[[:lower:]]’ 代替 ‘[a-z]’, 它在丹麥語里同樣有效,雖然丹麥的字母表里 ‘z’ 后面還有三個字母.這些字符集由當前場合的 LC_CTYPE 分類定義.
(v) 符號對映,象 ‘[.ch.]’ 或 ‘[.a-acute.]’, 在 ‘[.’ 和 ‘.]’ 之間的字符串是定義在當前場合的對映元素.注意這可以是多字符元素.
(vi) 等類表達式,象 ‘[=a=]’ ,在 ‘[=’ 和 ‘=]’ 之間的字符串是任意等類中的對映元素, 它定義在當前場合. 例如, ‘[[=a=]]’ 可以等同于 `[a徉溻]’ (警告:這里有Latin-1字符),也就是 `[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]’.
原創文章,作者:TQT,如若轉載,請注明出處:http://www.www58058.com/73939
對文件能配符進行了介紹,內容介紹的很詳細,排版需要再往好的排一下!