Wildcard与Regular Expression的区别
转载自 Shell十三问:http://wiki.jikexueyuan.com/project/13-questions-of-shell/wildcard.html题目:[^ ] 跟[! ]差在哪? (wildcard)这个题目说穿了, 就是要探讨Wildcard与Regular Expression的差别的。 这也是很多初学shell的朋友很容易混淆的地方。 首先,让我们回到十三问之第2问, 再一次将我们提到的command line format 温习一次: command_nameoptionsarguments 同时,也再来理解一下,我在第5章所提到的变量替换的特性: 先替换,再重组commandline! 有了这个两个基础后,再让我们来看Wildcard是什么回事吧。 Part-I Wildcard (通配符)首先, `Wildcard`也是属于`commandline`的处理工序,作用于`arguments`里的`path`之上。 没错,它不用在 换句更为精确的定义来讲, `wildcard`是一种命令行的路径扩展(pathexpansion)功能。 提到这个扩展,那就不要忘了 command line的“重组”特性了! 是的,这与 也就是在 了解了
Note: list 中可以指定单个字符,如abcd,也可以指定ASCII字符的起止范围,如 a-d。 即[abcd] 与 [a-d] 是等价的,称为一个自定义的字符类。 例如: a*b#a与b之间可以有任意个字符(0个或多个),如aabcb,axyzb,a012b,ab等。 a?b#a与b之间只能有一个字符,但该字符可以任意字符,如aab,abb,acb,azb等。 a[xyz]b#a与b之间只能有一个字符,但这个字符只能是x或者y或者z,如:axb,ayb,azb这三个。 a[!0-9]b#a与b之间只能有一个字符,但这个字符不能是阿拉伯数字,如aab,ayb,a-b等。 a{abc,xyz,123}b#a与b之间只能是abc或者xyz或者123这三个字串之一,扩展后是aabcb,axyzb,a123b。
基本上,要掌握wildcard并不难, 只要多加练习,再勤于思考,就能灵活运用了。 再次提醒: 别忘了wildcard的"扩展"+"重组"这个重要特性,而且只作用在argument的path上。 比方说, 假如当前目录下有: a.txt b.txt c.txt 1.txt 2.txt 3.txt 这几个文件。 当我们在命令行中执行 于是根据匹配的路径,扩展为: 1.txt 2.txt 3.txt, 在重组出 因此,你在命令行上敲 Part-II Regular Expression (正则表达式)接下来的Regular Expression(RE) 可是个大题目,要讲的很多。 我这里当然不可能讲得很全。 只希望能带给大家一个基本的入门概念,就很足够了... 先来考一下英文好了:What is expression? 简单来说,就是"表达",也就是人们在沟通的时候所要陈述的内容。 然而,生活中,表达方要清楚的将意思描述清楚, 而让接收方完整无误地领会,可不是件容易的事情。 因而才会出现那么多的"误会",真可叹句"表达不易"啊...... 同样的情形也发生在计算机的数据处理过程中, 尤其是当我们在描述一段"文字内容"的时候.... 那么,我们不禁要问: 有何方法可以让大家的误会降至最低程度, 而让表达的精确度达到最高程度呢? 答案就是"标准化"了, 也就是我们这里要谈的 然而,在进入 关键是要能够区分 shell command line上的meta与literal的这两种不同的字符类型。 然后,我这里也跟你讲:RE 表达式里字符也分meta与literal这两种。 呵,不知亲爱的读者是否被我搞混乱了呢?... ^_^ 这也难怪啦,因为这的确是最容易混淆的地方, 刚学 简单而言,除非你将 比方说, *``这个字符,在RE里是一个modifier(修饰符);而在command line上,确是wildcard(通配符)**。 那么,我们该如何解决这样的冲突呢? 关键就是看你对shell十三问的第4问中所提的quoting是否足够理解了! 若你明白到shell quoting 就是用来在command line上关闭shell meta这一基本原理, 那你就能很轻松的解决 RE meta与shell meta的冲突问题了:用shell quoting 关闭掉shell meta就是了。 就这么简单... ^_^ 再以刚提到 好了,说了大半天,还没有进入正式的RE介绍呢.... 大家别急,因为我的教学风格就是要先建立基础,循序渐进的... ^_^ 因此,我这里还要再??嗦一个观念,才会到RE的说明啦...(哈...别打我...) 当我们在谈到RE时,千万别跟wildcard搞混在一起! 尤其是 在commandline的位置里,wildcard只作用于argument的path上; 而RE却只用于"字符串处理"的程序中,这与路径名一点关系也没有。
okay,够了够了,我已看到一堆人开始出现不耐烦的样子了... ^_^ 现在,就让我们登堂入室,揭开RE的神秘面纱吧, 这样可以放过我了吧? 哈哈... 在RE的表达式里,主要分为两种字符: 然而,在介绍 一、所谓的char set就是将多个连续的字符作为一个集合。 例如:
note: abc|xyz 表示abc或xyz这两个char set之一 在认识了RE的char set这个概念之后,然后,在让我们多认识几个RE中常见的meta字符: 二、 锚点(anchor): 用以标识RE在句子中的位置所在。 常见的有:
三、 修饰符(modifier):独立表示时本身不具意义,专门用以修饰前一个char set出现的次数。 常见的有:
然而,当我们在识别modifier时,却很容易忽略"边界(boundary)字符"的重要性。 以 然而,答案却是可以的!为什么呢? 让我们重新解读 但当我们用 但,若我们在这些RE前后分别加 刚学RE时,只要能掌握上面这些基本的meta的大概就可以入门了。 一如前述,RE是一种规范化的文字表达式, 主要用于某些文字处理工具之间,如: grep, perl, vi,awk,sed,等等, 常用于表示一段连续的字符串,查找和替换。 然而每种工具对RE表达式的具体解读或有一些细微差别, 不过节本原理还是一致的。 只要掌握RE的基本原理,那就一理通百理了, 只是在实践时,稍加变通即可。 比方以grep来说, 在Linux上,你可以找到grep,egrep,fgrep这些程序, 其差异大致如下: grep: 传统的grep程序,在没有任何选项(options)的情况下,只输出符合RE字串的句子, 其常见的选项如下: egrep:为grep的扩充版本,改良了许多传统grep不能或者不便的操作, grep下不支持 grep 不支持 grep 在处理 等诸如此类的。我个人建议能用egrep就不用grep啦...^_^ fgrep: 不作RE处理,表达式仅作一般的字符串处理,所有的meta均市区功能。 好了,关于RE的入门,我们暂时就介绍到这里。 虽然有点乱,且有些观念也不恨精确, 不过,姑且算是对大家的一个交差吧...^_^ 若这两天有时间的话,我在举些范例来分析一下,以帮助大家更好的理解。 假如更有可能的话,也顺道为大家介绍一下sed这个工具。 讲到command line的重组特性, 真的需要我们好好的加以解释的。 如此便能抽丝剥茧的一层层的将整个command line分析的 一清二楚,而不至于含糊。 假如这个重组的特性理解了,那我们介绍一个好玩的命令: 我们在变量替换的过程中,常会碰到所谓的复式变量的问题: 如: 我们都知道 这个问题我们可用很轻松的用 说穿了, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- scala – 未来回调方法与Promises [成功与失败]之间的区别?
- Typescript中的Angular:如何将泛型Type传递给函数
- bootstrap multiselect 多选功能实现方法
- bash – Shell脚本和正则表达式:哪一个更适合匹配数字,[[:
- WebService org.xml.sax.SAXParseException: Document root
- WebService(4):CXF Spring开发WebService,基于SOAP和RE
- 在Angular 2中的ngx-bootstrap Typeahead中绑定一个Object而
- 【数据结构】迷宫搜索
- scala – OpenCL是否适合基于代理的模拟?
- Bootstrap精简教程