何为正则表达式?
UNIX/Linux上有许多文本处理工具,其中最主要最重要要属grep、sed、和awk三种了,被称为文本处理三剑客。但是要完全认识他们的各种功能,则必须现在正则表达式及其元字符的使用上打好基础。
什么是正则表达式呢?正则表达式(regular expression,RE)是一种字符模式,用于在查找过程中匹配指定的字符。正则表达式的有趣之处在于可以用特殊的元字符来控制他们,以实现强大的匹配功能。
正则表达式元字符
元字符是这样一类字符,他们表达的不是字面本身的含义,而是代表其它的特定的含义,以此来进行模式匹配界定。
元字符有两类:shell元字符和正则表达式元字符。
Shell元字符由shell来解析。例如,当用户输入命令“rm *”时,命令中的星号“*”就是一个shell元字符,称为通配符。Shell将其解析为“匹配当前工作目录下的所有文件名”。
正则表达式的元字符则是由各种执行模式匹配的程序来解析,譬如vi、grep、sed、和awk。可以用元字符来定位在行首行尾出现的单词,也可以用元字符指定任意字符或某一组字符,从而对其执行查找及增删替换等操作。例如,下面的这条sed命令:
表示把行首的hello单词替换成大写的Hello。拖字符”^”代表在行首,”\>”表示单词的结束。
有5种基本的元字符可以被UNIX/Linux的所有模式匹配工具识别。表1-1列出了可以在所有版本的vi、ex、grep、egrep、sed和awk中使用的元字符,其他的则可能适用于部分工具中。
表1-1 正则表达式元字符
表 1-2
下面我们将举例来讲解每个元字符,假定在如下文字中查找。Grep命令能查找被模式匹配到的行并显示整行内容。
基本正则表达式元字符
1、行首定位符”^”
拖字符^查找行首开头的为love的行。
2、行尾定位符”$
”
美元$为行尾定位符,此行中day位于行尾,后面紧跟换行符。
3、任意单个字符”.”
句号(.)匹配除换行符的任意单个字符。
4、零个或多个前字符”*”
星号(*)匹配零个或多个前字符,它就像和前面的字符粘在一起一样,只控制这个字符.匹配次数包括0次,如上例中的lv。
5、匹配一组字符的任意一个”[]”
6、一个范围中的一个字符”[ – ]”
方括号中的连字符匹配某一范围中的一个字符,上例中匹配li后接一个a-z的任意字符,由于匹配的是ASCII值的范围,所以不能写成[z-a]。
7、不在组内的字符”[^ ]”
方括号内的拖字符是一个否定元字符。上例中匹配ove后加一个不是a到z,A到Z,且不是0-9的字符,那就可能是空格,标点符号如?了。
以上为正则表达式的基本元字符,他们可以组合起来成为更复杂的表达式。
其他表达式元字符
下面的元字符不一定适用于所有使用正则表达式的工具,但可用于vi,vim编辑器,及某些版本的sed和grep。此外还有一种被egrep和awk所使用的扩张正则表达式。
1、词首定位符\<和词尾定位符\>
上例中查找每一行的单词love.单词的存在形式可以是:以空格开头、由标点终结、开始于行首、结束语行尾等,所以字母和数字都是可以属于单词的。
2、”\( …\)”记录模式
上例中第一个被”\(\)”记录的标记为\1,第二个被”\(\)”记录的标记为\2,以此类推。如果把他们互相替换,则标签所代表的被记录的内容也会交换位置。
3、模式的重复”\{m,n\}”,表示其前面的字符最少重复m次,最多重复n次。
原创文章,作者:beyond,如若转载,请注明出处:http://www.178linux.com/36216