正则表达式

正则表达式是通过正则表达式引擎实现的,linux有2种流行的正则表达式引擎:

1.POSIX基本正则表达式(BRE)引擎

2.POSIX扩展正则表达式(ERE)引擎

大多数linux工具都至少符合POSIX BRE引擎规范,有些工具,如sed只实施了BRE的子集,gawk使用ERE引擎来。

BRE模式

1.纯文本

 支持文本,且 区分大小写、支持空格。

2.特殊字符

可识别^、$等特殊字符,如果要单独使用,需要在前面加\进行转义。

#echo 'The cost is $4.00' | sed -n '/\$/p' 

The cost is $4.00

备注:/不是特殊字符,但在sed或gawk中使用时需要转义

#echo "3 / 2" | sed -n '/\//p'

3 / 2

3.锚字符

   ^ :锚定行首,此字符后面的字符必须出现在行首

  $:锚定行尾,此字符前面的字符必须出现在行尾

 \b或\<:锚定词首,此字符后面的字符必须作为单词开始

\b或\>:锚定词尾,此字符前面的字符必须作为单词结束

#匹配以Book开始的行
# echo "Books are great" | sed -n '/^Book/p' 
Books are great

组合锚定:
1.匹配特定的行
#sed '^this is a test$'
2.删除文件空白行
#sed '/$^/d' testfile

#匹配以w开头的单词
#echo 'hello world, hello beijing.' | sed -n '/\<w/'
hello world, hello beijing.

3.点字符:.号

匹配任意单个字符(包括空格),除换行符

#echo 'this is a cat'  | sed -n ‘/.at/p’

this is a cat

4.星号:*

匹配前1字符任意次,包括0次

#echo 'ik' | sed -n '/ie*k/p'
ik
#echo 'iek' | sed -n '/ie*k/p'
iek
#echo 'iek' | sed -n '/ie*k/p'
ieek
1.用于不同语言拼写差异,如:美式英语、英式英语的colour和color表示同一意思
#echo 'I'm getting a color TV' | sed -n '/colou*r/p'
I'm geting a color TV
#echo 'I'm getting a colour TV' | sed -n '/colou*r/p'
I'm geting a colour TV

2.点号与星号连用,0到多个任意字符
#echo 'You are a boy.' | sed -n '/You.*boy/p'
You are a boy.
#echo 'Youboy' | sed -n '/You.*boy/'p
Youboy

3.星号和字符组组合,指定文本中出现多个的一组字符或一个字符区间
#echo 'bt'  | sed -n '/b[ae]*t/p'
bt
#echo "bat" | sed -n '/b[ae]t/p'
bat
#echo "baakkt" | sed -n '/b[ae]t/p'  #出现的kk非字符组中的字符,所以不匹配。

5.字符组:[]

    []:匹配[]中的任意字符

       [acd157]  匹配a、c、d、1、5、7的任意一个

       [a-ch-m]  匹配a到c、h到m之间的任意一个(指定多个区间)

       [0-3]       匹配0-3(指定单个区间)

   [^]:匹配[]中的任意字符外的其他字符

         [^a-b]  #匹配除a-b之外其特所有单个字符

  特殊字符:

   [:alpha:]   匹配任意字母,即A-Z和a-z

   [:lower:]   匹配任意小写字母

   [:upper:] 匹配任意大写字母

   [:alnum:]  匹配任意字母和数字,即0-9、A-Z、a-z

   [:digit:]   匹配0-9数字

   [:space:] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR

   [:blank:] 匹配空格或制表符

   [:print:] 匹配任意可打印字符

   [:punct:] 匹配标点符号

    这些特殊字符在字符组中,表现为:[[:digit:]]

典型案例:
1.不清楚字符大小写时用
#echo "yes"  | sed -n '[Yy]es'
yes
#echo "Yes"  | sed -n '[Yy]es'
Yes

2.多个字符组连用(多个字符都不知道大小写)
#echo "yEs"  | sed -n '[Yy][Ee][Ss]'
yEs

3.匹配任意数字
#echo "abc123" | sed  -n '/[[:digit:]]/p'
abc123

5.聚合表达式:()

 ()中的内容必须匹配

#echo "start"  |  sed -n '/st\(art\)/p'

start

备注:BRE使用聚合分组时,需要对园括号进行转义

聚合组引用:

\1:引用第1个聚合组

\2:引用第2个聚合组

#echo "start abc start" | sed '/st\(art\) abc st\1/p' 

start abc start

备注:

      BRE也支持ERE的?、+、|、{}用法,只是需要使用反斜杠进行转义

ERE模式

ERE支持BRE的所有内容,新增如下内容:

1.问号

匹配前1字符0次或1次

#echo 'bet' | gawk '/be?t/{print $0}'    #echo bt也可匹配,echo beet则不会被匹配

bet

问号与字符组一起使用

#echo 'bat'  | gawk '/b[ae]?t/{print $0}'  #表示问号前的字符组中任意字符出现0-1次

bat   

2.加号

   匹配前一字符1次或多次,至少1次。

#echo ‘bet’  | gawk '/be+t/{print $0}'    #bt不匹配,beet匹配

bet

3.花括号:{}
  指定前1字符出现的次数

  {m,}  #前1字符至少出现m次

  {m}  #前1字符只出现m次

  {m,n} #前1字符至少出现m次,最多出现n次

示例:

1.grep
#echo ''beeet" | grep -E 'be{3}t'
2.gawk
#echo "beeet" | gawk --re-interval '/be{1,3}t/{print $0}' #gawk要支持{},需要--re-interval

4.管道符:|

  多个模式之间使用|,任何一个模式匹配则匹配成功

#echo "The cat is asleep"  | gawk '/dog|cat/{print $0}'

The cat is asleep

#echo "The dog is asleep" | gawk '/dog|cat/{print $0}'

The dog is asleep

5.聚合表达式

   参见BRE,只是不需要对圆括号进行转义。

  

  

  

 

posted @ 2017-06-23 15:45  思念我的娃  阅读(182)  评论(0编辑  收藏  举报