懒散的人

导航

Linux中正则表达式简单使用

正则表达式就是由一系列特殊字符组成的字符串,其中每个特殊字符都被称为元字符。这些元字符并不表示为它们字面上的含义,而会被解释为一些特定的含义。

一个正则表达式会包含下列一项或多项:

(1)一个字符集。这里所指的字符集只包含普通字符,这些字符只表示它们的字面含义。正则表达式的最简单形式就是只包含字符集,而不包含元字符。

(2)锚。锚指定了正则表达式所要匹配的文本在文本行中所处的位置。 5个锚定符:

  行首锚定:^

  行尾锚定:$

  词首锚定:\<字符

  词尾锚定:字符\>

  单词锚定:\<字符\>

(3)修饰符。它们扩大或缩小(修改)了正则表达式匹配文本的范围,修饰符包含星号,括号和反斜杠。

 ① 点 -- .-- 用于匹配任意一个字符,除了换行符。

 ② 星号 -- *-- 用来匹配它前面字符的任意多次,包括0次。

 ③ 脱字符号 -- ^-- 匹配行首,但是某些时候需要依赖上下文环境,在RE中,有时候也表示对一个字符集取反。

 ④ 美元符 -- $-- 在RE中用来匹配行尾。

  "XXX$"   匹配行尾的XXX

  "^$"   匹配空行

 ⑤ 中括号 -- [...]-- 在RE中,将匹配中括号字符集中的某一个字符。

   "[xyz]"  将会匹配字符x,y或z

  "[c-n]"  匹配字符c到字符n之间的任意一个字符

  "[B-Pk-y]"  匹配从B到P或从k到y之间的任意一个字符

  "[a-z0-9]"  匹配任意一个小写字母或数字

  "[^b-d]"  将会匹配范围在b到d之外的任意一个字符,这就是使用^对字符集取反的一个例子。

  可以将多个中括号字符集组合使用,能够匹配一般的单词或数字。"[Yy][Ee][Ss]" 能够匹配yes,Yes,YES,yEs等。

 ⑥ 反斜杠 -- \-- 用来转义某个特殊含义的字符,这意味着这个特殊字符将会被解释为字面含义。

 ⑦ 转义的"尖括号"-- \<...\>-- 用于匹配单词边界。尖括号必须被转义才含有特殊的含义,否则它就表示尖括号的字面含义。"\<the\>"完整匹配单词"the",不会匹配"them","there","other"等等。

 ⑧ 转义小括号表示分组,转义大括号表范围。基本正则没有竖线|

 ⑨ 转义"大括号"-- \{ \}-- 在转义后的大括号中加上一个数字,这个数字就是它前面的RE所能匹配的次数。"[0-9]\{5\}"精确匹配5个数字。

 例子:

(1)新建文件f1,内容为:

  (第一行为空)

  123

  a123

  aa123

# grep 'a*' f1

a*表示a字符出现了0次或多次

(2)# ll | grep '^-' (列出当前目录下的普通文件)

   # ll | grep '^d'(列出当前目录下的所有目录)

(3)grep 'bash$' --color=auto /etc/passwd

root:x:0:0:root:/root:/bin/bash
u1:x:500:500::/home/u1:/bin/bash
rootabc:x:501:501::/home/rootabc:/bin/bash

 (4)# grep 'r..t' --color=auto /etc/passwd

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
rootabc:x:501:501::/home/rootabc:/bin/bash

 (5)# grep '^root'  /etc/passwd

root:x:0:0:root:/root:/bin/bash
rootabc:x:501:501::/home/rootabc:/bin/bash

 (6)# grep '^root\>'  /etc/passwd(词尾锚定)

root:x:0:0:root:/root:/bin/bash

 (7)去掉空白行

 # grep -v '^#' /etc/squid/squid.conf | grep -v '^$'   (-v表示取反,'^$'表示空白行)

(8)# grep  '[a-z]'  f1  (搜索某一行包含有字母的)

(9)# grep  '[0-9]'  f1  (搜索某一行包含有数字的)

(10)# grep  '[[:digit:]]'  f1  (搜索某一行包含有字母的,遵循POSIX规范的写法)

(11)# grep  '[[:alpha:]]'  f1

取范围-- { },要转义-- \{ \},这是标准正则表达式支持的。

# grep 'o\{2\}' --color=auto /etc/passwd   (\{2\}表示字母o至少出现2次)

# grep 'o\{1,2\}' --color=auto /etc/passwd  (\{1,2\}表示字母o出现1次或以上)


例如:我们要匹配一个手机号码。

1. 分析字符串特点,手机号码是数字,并且是以1开头,11位长

2.可以写”1\d”   1开头,后面跟着数字,也可以是:1[0-9]

3.数字长度是11位 ,继续补充1\d{10} ,后面数字长11字符,也可以是:1[0-9]{10} ;{}里面数字,表示它左边字符可以重复出现次数

4.所有字符必须是11位,因此头尾直接必须满足条件,因此可以是:^1\d{10}$ 了。

例如:我们匹配QQ号码

1.分析QQ号码特点是,号码最少是5位数,首位字符非0,最大长度,目前到11位了

2.可以先定义首位字符,[1-9]\d    首位字符是1到9,后面是字符

3.后面字符个数在4到10位 [1-9]\d{4,10}

4.所有字符串必须都满足上面匹配,因为可以写成:^[1-9]\d{4,10}

 

posted on 2019-09-28 16:43  懒散的人  阅读(933)  评论(0)    收藏  举报