编写shell脚本时经常用到的基本操作就是寻找包含特定文本的行,虽然用简单的grep命令可以完成一些简单的工作,但是正则表达式无疑是绕不开的。本文主要介绍基本正则表达式。
总的来说,正则表达式由两部分组成:一般字符和特殊字符。特殊字符(meta)在正则表达式中往往具有特殊的意义。
先介绍几个简单的特殊字符:
(1) . 代表任意的单个字符
(2) * 匹配在它之前的任意数目的单个字符
(3) ^ 匹配其后面紧接着的正则表达式在行起始处
(4) $ 匹配其前面的正则表达式在行末尾
(5) [] 匹配方括号里面的任意一个字符
举几个例子:
表达式 tolstoy 匹配位于一行上任何位置的7个字母:tolstoy
表达式 ^tolstoy 匹配tolstoy出现在行首的行。比如:tolstoyabc defghi jkl
表达式 tolstoy$ 匹配tolstoy出现在行首的行。比如:abc defghi jkltolstoy
表达式 ^tolstoy$ 匹配正好为tolstoy的行,没有其他字母。
表达式 [Tt]olstoy 匹配在一行上的任意位居中,含有Tolstoy或者tolstoy的行
表达式 tol.toy 匹配在一行上的任意位居中,含有tol这3个字母,加上任何一个字符,再接着toy这3个字母。
表达式 tol.*toy 匹配在一行的任意位居中,含有tol这3个字幕,加上任意个(0或多个)字符,再加上toy这3个字母。
另外,可以用[: :]的方式表达某些字符集。
比如[:alnum:]表示数字字符,[:alpha:]表示字母字符,[:lower:]表示小写字母字符,[:upper:]表示大写字母字符等等。
使用的时候,比如表达式 ab[[:alnum:]]cd 匹配包含ab这2个字符,接着一个任意数字,再接着cd字符的行,比如ab1cd,ab3cd等等。注意有两个方括号。为什么呢?请看看方括号特殊字符的意义。
后向引用:匹配正则表达式前面的部分。意思就是对一个正则表达式的某一部分做个标记,后面用数字代替。举个例子。 表达式 \(ab\)\(cd\)[def]*\2\1 匹配含有abcd接着def中间的任意0个或多个再接cdab,比如abcdcdab、abcdeeecdab,abcdddeeffcdab等等。这里的 \(ab\)就是对ab做个标记,这是第一个标记,\(cd\)是第二个标记,后面的\2就是指的cd,也就是第二个标记,\1也就是指的ab。
区间表达式:能匹配出现一定次数的某个字符。其格式是将一个或两个数字放在\{与\}之间。
\{n\} 表示前置正则表达式所得结果重现n次
\{n,\} 表示前置正则表达式所得结果重现至少n次
\{n,m\}表示前置正则表达式所得结果重现n至m次
比如说a\{5\} 表示重现5个a,q\{10,42\}表示重现10到42个q。
上面就是基本正则表达式的基础知识,对于一些更加详细的内容,可以查看相应的资料。除了基本正则表达式之外,还有扩展正则表达式。另外还有sed、awk等程序对文本进行替换等。暂时消化不了那么多,先到这里吧。