Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1686440
  • 博文数量: 782
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 4140
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 21:37
个人简介

Linux ,c/c++, web,前端,php,js

文章分类

全部博文(782)

文章存档

2015年(8)

2014年(28)

2013年(110)

2012年(307)

2011年(329)

分类:

2012-05-03 09:06:32

原文地址:基础正则表达式字符 作者:windtunnel

一、待查找的字符串(word)在行首

RE字符:^word
范例      :查找行首为#开始的那一行,并列出行号(grep 后带 -n 的作用)
命令      :grep -n '^#' regular_express.txt

二、待查找的字符串(word)在行尾

RE字符:word$
范例      :将行尾为!的那一行打印出来,并列出行号
命令      :grep -n '!$' regular_express.txt

三、代表一定有一个任意字符的字符

RE字符:.
范例      :查找字符串可以是(eve)(eae)(eee)(e e),但不能有(ee)!即e与e中间一定“有且仅有”一个字符,而空格也是字符
命令      :grep -n 'e.e' regular_express.txt

四、转义字符,将特殊符号(比如^  $  .  \  *  [  ]等等)的特殊意义去除

RE字符:\
范例      :查找含有单引号 ' 的那一行
命令      :grep -n '\'' regular_express.txt #注意\后面是个单引号,而非一个双引号

五、重复零个到无穷多个的前一个字符

RE字符:*

范例      :找出含有(es)(ess)(esss)等的字符串,注意,因为*可以是0个,所以 es 也是符合待查找字符串。另外,因为 * 为重复“前一个RE字符”的符号,因此,在*之前必须紧接着一个RE字符。例如任意字符则为".*"(注意星号前面是一个英文句号,因为英文句号代表“有且仅有一个任意字符”)。

命令      :grep -n 'ess*' regular_express.txt     #因为*可以是0个,所以 es 也是符合待查找字符串

六、从字符集合的RE字符里面找出想要选取的字符

RE字符:[list]

范例      :查找含有(gl)或(gd)的那一行,需要特别留意的是,在[ ]当中代表一个待查找的字符,例如"a[afl]y"代表查找的字符串可以是aay、afy、aly,即[afl]代表的是a或f或l的意思。

命令      :grep -n 'g[ld]' regular_express.txt

七、从字符集合的RE字符里面找出想要选取的字符范围

RE字符:[n1-n2]

范例      :查找含有任意数字的那一行。需要特别注意的是,在字符集合[ ]中的减号-是有特殊意义的,它代表两个字符之间的所有连续字符。 但这个连续与否与ASCII编码有关,因此,你的编 码需要设置正确(在bash当中,需要确定LANG与LANGUAGE的变量是否正确)!例如所有大写字符则为[A-Z]。

命令      :grep -n '[0-9]' regular_express.txt   #查找含有任意数字的那一行

        grep -n '[A-Z]' regular_express.txt   #查找含有任意大写字母的那一行

八、从字符集合的RE字符里面找出不要的字符串或范围

RE字符:[^list]

范例      :查找的字符串可以是(oog)(ood)但不能是(oot),那个^在[ ]内代表的意义是”反向选择“的意思。例如,我不要大写字母,则为[^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来查找,却发现该文件内的所有行都被列出,为什么?因为这个[^A-Z]是”非大写字符“的意思,因为每一行均有非大写字母。

命令      :grep -n 'oo[^t]' regular_express.txt

九、连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符

RE字符:\{n,m\}

范例      :在g与g之间有2个到3个的o存在的字符串,即(goog)(gooog)

命令      :grep -n 'go\{2,3\}g' regular_express.txt


再次强调:正则表达式的特殊字符与一般在命令行输入命令的”通配符“并不相同。例如,在通配符中的*代表的是零到无限多个字符的意思,但是在正则表达式当中,*则是重复0到无穷多个的前一个RE字符的意思,使用的意义并不相同,不要搞混了!

举例来说,在不支持正则表达式的ls这个工具中,我们使用”ls -l *“代表的是任意文件名的文件,而”ls -l a*“代表的是以a开头的任何文件名的文件,但在正则表达式中,我们要找到含有以a为开头的文件,则必须要这样(需搭配支持正则表达式的工具):

ls | grep -n '^a.*'


阅读(548) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~