正则表达式及元字符解析
时间:2010-10-28 来源:cup
元字符分为两类:shell元字符和正则表达式元字符。Shell元字符由linux的shell来解析,如rm *,此处的*为一个shell元字符,即通配符。Shell将其含义解析为“匹配当前目录下的所有文件名”。
正则表达式元字符由各种执行模式匹配操作的程序来解析,如vi、grep、sed、awk。正则表达式元字符是一类特殊的字符,通过它们以某种方式界定模式,从而控制进行哪些替换。可以使用元字符来定位在行首或者行尾出现的单词。也可以用元字符指定任意字符或某一组字符,从而实现同时查找大写和小写字符,或只查找数字等操作。
正则表达式元字符表
元字符 |
功能 |
示例 |
匹配对象 |
^ |
行首定位符 |
/^home/ |
匹配所有以home为开头的行 |
$ |
行尾定位符 |
/home$/ |
匹配所有以home为结尾的行 |
. |
匹配单个字符 |
/h..e/ |
匹配包含h后跟两个字符,在跟个e的行 |
* |
匹配0或多个重复位于*前的字符 |
/*home/ |
匹配包含零个或多个home之前的字符,不含空格 |
[] |
匹配一组字符中的任一个 |
/[Hh]ome/ |
匹配包含Home或home的行 |
[x-y] |
匹配指定范围内的一个字符 |
/[x-z]cas/ |
匹配包含在x到y之间的任意字符 |
[^] |
匹配不在指定组内的字符 |
/[^x-y]/ |
匹配不在x到y之间的任意字符 |
\ |
转义元字符 |
/home\./ |
匹配包含home.的字符,\.用来转义句号. |
\< |
词首定位符 |
/\<home/ |
匹配包含home开头的字符 |
\> |
词尾定位符 |
/home\>/ |
匹配包含home结尾的字符 |
\(..\) |
匹配稍后要使用的字符的标签 |
/\(love\)able\1er/ |
模式love被保存为标签1,用\1表示,可以使用\1代替love |
X\{m\} |
字符x出现的次数,m次 |
O\{5\} |
匹配包含5个0的字符 |
X\{m,\} |
字符x出现的次数,至少m次 |
o\{5,\} |
匹配包含至少5个o的字符 |
X\{m,n\} |
字符x出现的次数,至少m次,不超过n次 |
O\{5,10\} |
匹配包含5到10个包含字母0的字符 |
举例:(Vi中使用)
/home/: 查找vi中home单词。
/^home/: 查找vi中以home为首的行
/home$/: 查找vi中以home为结尾的行
/h..e/: 查找vi中h开头后面接着任意两个字符,e结尾的单词
/h*me/: 查找vi中h开头me结尾中间零个或任意多个字符的单词,不含空格
/[hH]ome/: 查找vi中Home和home的单词
/hom[a-z]/: 查找vi中hom后跟着任何一个ASCII码值在a-z之间字符的单词,[a-z]表示小写字母
/home[^a-ZA-Z0-9]/: 查找vi中包含home后面跟着特殊字符,不含大写,小写字母和数字的字符。如home. Home, home@等。
/\<h.*e\>/: 查找vi中包含h开头,e结尾,中间包含零个或若干个字符的字段/单词
1,$/\(love\)er/\1ory/g:vi中将love作为标签1,将loveer替换成loveory。
Grep与正则表达式元字符
命令格式:grep word filename filemane
Grep aa bb
Echo $? #查看grep查找之后的退出状态。0为成功,1为没有找到模式bb,2为搜索不到文件aa
2
grep aa /etc/passwd: 打印/etc/passwd中,包含正则表达式aa的行。
Grep aa /etc/pass*: 打印/etc/pass开头的文件中,包含正则表达式aa的行
Grep ‘^a’ /etc/passwd: 打印/etc/passwd中,a开头的行。
Grep ‘bash$’ /etc/passwd: 打印/etc/passwd中,bash结尾的行。
grep 'root\:' /etc/passwd: 打印/etc/passwd中root后跟个:正则表达式的行
grep '\:x' /etc/passwd: 打印/etc/passwd中x前跟个:正则表达式的行,打印所有包含:x的行
grep '^[tx]' /etc/passwd: 打印/etc/passwd中包含以t、x开头的行
grep '[a-z]\{9\}' /etc/passwd: 打印/etc/passwd中包含至少9个小写字母的行
grep '\<root' /etc/passwd: 打印/etc/passwd中包含root开头单词的行
grep '\<root\>' /etc/passwd: 打印/etc/passwd中包含root词的行,即包含单词root的行
grep -n '\<root' /etc/passwd: 打印/etc/passwd中包含root开头单词的行,并标明行号
grep -w 'root' /etc/passwd: 打印/etc/passwd中包含root的行
grep '\broot\b' /etc/passwd: 打印/etc/passwd中包含root的行,\b是词分界线。
-n:显示行号
-i:比较字符时忽略大小写
-v:反向查找,显示不匹配的行
–c:显示匹配的行的数目,不显示行的内容
egrep 'ro+' /etc/passwd: 打印/etc/passwd中包含ro后跟一个或若干字符串的行
egrep 'root|caiwu' /etc/passwd: 打印/etc/passwd中包含root或caiwu的字符串的行
egrep 's(shd|ell)' /etc/passwd: 打印s后面跟shd或ell的字符串的行
egrep '2\:?[0-9]' /etc/passwd: 打印2后面跟0个或一个数字在跟:的字符的行
?匹配零个或一个前导字符,lo?ve:l后面跟0个或一个o在跟ve的字符,如love,lve