文件通配符
包含 ‘?’, ‘*’ 或 ‘[‘ 字符的字符串称为通配符模板(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.178linux.com/73939
评论列表(1条)
对文件能配符进行了介绍,内容介绍的很详细,排版需要再往好的排一下!