Who am I

我的照片
Hefei, Anhui, China
Research Fields: Satellite Geodesy

2012年2月11日星期六

Shell 正则表达式

shell正则表达式
一个正则表达式是由普通字符以及特殊字符(也称元字符)组成的匹配模式。把该模式与数据文件、其它命令的输出等对象进行匹配。
注:区分shell正则表达式中的元字符与shell命令中的通配符,两者不同,切勿混淆。

shell元字符

^        行首定位符(当^位于正则表达式的第一个字符时,它表示行首定位符;否则,它匹配字符^)
/^Bobby/
Here is a tongue twister:
Bobby Bippy bought a bat.
Bobby Bippy bought a ball.

$         行尾定位符(当$位于表达式的最后一个字符时,表示行尾定位符;否则匹配字符$)
/Bobby$/
But so boldly Bobby banged it
That he burst his rubber ball, "Boo!" cried Bobby

/^$/      匹配一个空行

\<        词首定位符
/\<Bo/
That he burst his rubber ball,"Boo!" cried Bobby
Bobby Bippy bought a ball.

\>        词尾定位符
/ball\>/
Bobby Bippy bought a ball

在一个表达式搭配使用词首定位符与词尾定位符
/\<hole\>/
John's ball fell into the hole
John cried because it is his whole life

.         匹配任何除换行符之外的单个字符(换行符的匹配模式/\n/)
/B...y/
Bobby Bippy bought a bat.
Bobby Bippy bought a ball.

[]       匹配一组字符里的任意一个字符(不管[]的形式多复杂,它只匹配一个字符)

[abc]   匹配单个字符a或b或c
/[bw]all/
WIth his bat Bob banged the ball
Banged it bump against the wall

[a-z]  匹配小写字母a-z之一
[a-z A-Z 0-9] 匹配任意英文字母或数字之一-字符出现在[]的首或尾位置时是普通字符
/B[a-z]p/
Bobby Bippy bought a bat.
Bobby Bippy bought a ball.

[^]     匹配不在指定范围内的字符(区别与行首定位符,一定是在[]的首位置出现)
[^ab^c]     匹配不是a或b或^或c的任意一个字符
/all[^a-z A-Z 0-9]/     匹配all后加有一个特殊字符的字串
Bobby Bippy bought a ball.
Bad luck ball, Bad luck Bobby, bad luck ball.

前导字符
*  \  \?  \+  \{n,m\}       所谓前导字符,表示紧贴于元字符前面的单个普通字符或上面所述的元字符。
*      用于修饰前导字符,表示前导字符出现任意多次(包括0次)
\       转义字符
\?      用于修饰前导字符,表示前导字符出现0或1次
\+      用于修饰前导字符,表示前导字符出现1次或1次以上
\{n,m\} 用于修饰前导字符,表示前导字符出现n至m次
a*      匹配连续的任意(也包括0个)a
例:
/al*/
Bobby Bippy bought a bat.
With his bat Bob banged the ball
.*       匹配连续的任意(也包括0个)任意字符,也称万能匹配
a\?      匹配0或1个a
a\+      匹配1或多个a
a\{3,5\}  匹配3至5个连续的a
\.*       匹配0个或多个连续的.
此外,\{n,m\}还有其它几种形式:
\{n\}    匹配连续的n个前导字符
\{n,\}   匹配至少连续的n个前导字符
\?等价于\{0,1\}  *等价于\{0,\}   \+等价于\{1,\}

一些例子
[0-9]\{2\}       连续的两位数字
[0-1][0-9][-/][0-3][0-9][-/][0-9]\{2\}    表示时间格式MM-DD-YY或MM/DD/YY
80[234]\?86     将匹配8086,80286,80386,80486
/\<Bob.*all\>/
Bobby Bippy bought a ball
With his bat Bob banged the ball

扩展模式匹配
*(模式表)    匹配给定模式表中的”模式“0次或多次,各模式之间用|分开。
file*(.c | .o) 将匹配文件file file.c file.o file.c.c file.o.o file.c.o file.o.c等,不匹配file.h或file.s等
+(模式表)    匹配给定模式表中的”模式“1次或多次,各模式之间用|分开。
file+(.c | .o) 匹配file.c file.o file.c.c file.o.o file.c.o file.o.c等,但不匹配file
?(模式表)     匹配模式表中的”模式“0次或1次,各模式之间以|分开。
file?(.c | .o) 只匹配file file.c 和file.o
@(模式表)    匹配模式表中给定”模式“的一次出现,各模式之间以|分开。
file@(.c | .o) 匹配file.c file.o
!(模式表)      除给定模式表中的模式之外,它可以匹配其它任何一个。

没有评论:

发表评论