首页 > 代码库 > linux笔记三 --正则表达式

linux笔记三 --正则表达式

前言:本篇博客的主要是记录学习过程中的正则表达式和sheel通配符。

内容:

    1.shell通配符

       通配符是基于bash解释器解析的,而正则表达式由正则引擎的软件(如awk,grep,sed等)解析,二者完全不同。

*表示匹配任意多个字符,0个到多个。
表示匹配任意一个字符。
[]表示选择其中的一个匹配。
[-]
表示匹配一个范围中的一个字符。如:[a-z]匹配到a-z中的一个。
[^]或[!]表示匹配其中的任意一个。如:[^a-z]不匹配其中的任意一个

实例(此处实例参考其他博客)

  • [root@linux ~]# ls test*     #那个 * 代表后面不论接几个字符都予以接受  

  • [root@linux ~]# ls test?     #那个 ? 代表后面"一定"要接"一个"字符  

  • [root@linux ~]# ls test???   #那个 ??? 代表"一定要接三个"字符!  

  • [root@linux ~]# cp test[1-5] /tmp  # 将 test1, test2, test3, test4, test5 若存在的话,就拷贝到 /tmp  

  • [root@linux ~]# cp test[!1-5] /tmp # 只要不是 test1, test2, test3, test4, test5 之外的其它 test?拷贝到 /tmp  

  • [root@linux ~]# cd /lib/modules/`uname -r`/kernel/drivers  # 系统先执行 uname -r 找出输出结果;将结果累加在目录上面,来执行 cd 的功能!   = cd /lib/modules/$(uname -r)/kernel  #另外,这个 quot (`) 的功能,也可以利用 $() 来取代喔!  

  • [root@linux ~]# cp *[A-Z]* /tmp   #表示文件中包含大写字母  

  • [root@linux ~]# ls -lda /etc/*[35]* #表示文件中包含数字3或者5. 

    注意:通配符就好比全局变量在任何时候都能使用,但是如果遇到了vi,awk,grep,sed等软件,则使用正则表达式,通配符就不在使用

2.谈谈正则表达式(这个比较难理解)1.正则表达式的一些特殊符号:

    [[:alnum:]] =[0-9a-zA-Z]等等。这里可以参考linux学习笔记一

    [[:xdigit:]]=[代表16进制的数字类型,包括0-9,A-F,a-f的数字与字符]

             [[:graph:]] = [代表了除了空格和Tab键以外的所有按键]

             [[:cntrl:]] =[代表了键盘上面的控制按键,即包括CR,LF,Tab,Del等]

            2.基础正则表达式语法(RE语法):一个字符串如果是正则表达式表示的,则其中的任意字符被称为RE字符。

            只支持普通正则表达式语法:^  $  .  *  \  []  "  ‘

            支持扩展正则表达式语法:^  $  .  *  \  []  "  ‘  +  ?  |  ()

标准的正则表达式:

基础RE字符意义和实例
^string

意义:以string为首的匹配行

实例:查找以root开头的匹配行

grep ‘^root‘ /etc/passwd

$string

意义:以string结尾的匹配行

实例:查找以数字结尾的匹配行

grep --color ‘[[:digit:]]$‘ /etc/inittab 

.

意义:代表一定有一个任意字符的字符(除换行符),在awk中可匹配换行

实例:查找r开始中间有两个字符,后面是一个t的行。

grep ‘r..t‘ /etc/passwd


\

意义:转义字符,将特殊符号的特殊意义去除,将普通字符变为特殊字符。
范例:查找含有单引号‘的那一行
grep -n \‘ 008.txt  


*

意义:重复0个到无穷多个前一个字符
范例:找出含有(ab)(aab)(acb)等的字符串,注意,因为*可以是0个,所以ab也是符合待查找字符串。另外,因为*为重复“前一个RE字符”的符号,因此在*之前一定要紧接着一个RE字符!例如任意字符则为.*
grep -n ‘a*b‘ 008.txt


[list]

意义:从字符集合的RE字符里面找出想要选取的字符(不包括换行符),在awk中可以包含换行符。注意此时中括号里的\.*等特殊字符均变成一般字符(除了[])。
范例:查找含有(gl)或(gd)的那一行,需要特别留意的是,在[]当中代表一个待查找的字符,例如“a[ab]b”代表查找的字符串可以是aab,abb
grep -n ‘a[ab]b‘ 008.txt


[n1-n2]

意义:从字符集和的RE字符里面找出想要选取的字符范围
范例:查找含有任意数字的那一行。需特别留意,在字符集合[]中的减号-是有特殊含义的,它代表两个字符之间的所有连续字符(与编码顺序有关)
grep -n ‘a[a-z]b‘ 008.txt


[^]

意义:反向选择
范例:查找的字符串可以是(ab)(aab)
grep ‘a[^c-z]‘ 008.txt




\{n\}

\{n,\}
\{n,m\}
意义:连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符 。
在支持扩展的正则表达式中用另一种形式,且n,m必须是0到255之间的整数:

注:本质上是扩展正则表达式的语法

grep ‘a\{1\}b‘ 008.txt  在b之前至少1个a

grep ‘a\{2\}b‘  008.txt 在b之前至少2个a

grep ‘a\{1,2\}b‘  008.txt 在b之前1-2个a

grep ‘a\{1,\}b‘  008.txt 在b之前至少1个a

扩展的正则表达式:      

grep需加-E (或者使用到扩展符号时加\)         

sed需加-r  (或者使用到扩展符号时加\)        

awk,perl本身支持扩展这则表达式(也就是说awk中如果要引用(为普通字符要[(]如此使用。)








\+

意义:重复一个或一个以上的前一个RE字符(和\{1\}是有区别的,\+表示最大的匹配,而\{1\}是最小的匹配)
例如:

grep ‘a\{1\}b‘ 008

ab

aab

aaab

 grep ‘a\+b‘ 008

ab

aab

aaab





\?

意义:零个或一个的前一个RE字符
和*的区别就是:?是最小匹配,*是最大匹配即匹配最长。





\|

意义:用或(or)的方式找出数个字符串,两边的字符串不能加额外的空格,

ABC|DEF表示ABC或DEF,A(BC|DE)F表示ABCF或ADEF

grep ‘a\(a\|b\)b‘ 008

范例:去除空白行和行首为#的行
grep -Env ‘^$|^#‘ regular_express.txt  
\(\)意义:找出“组”字符串,[]的引申

范例:查找glad或good这两个字符串,因为g与d是重复的,所以可以将la与oo以或的方式列于()中

grep -En ‘g(la|oo)d‘ regular_express.txt 

grep "l\(ik\|ov\)e" 008

()+意义:重复一个或一个以上的前一个“组”
{n}
{n,}
{n,m}
与普通正则表达式含义一致,只是在支持扩展正则表达式中要用此形式,即awk、grep -E、sed -r 中使

008文件内容:

m

a

ab

aab

abb

aaab

acb

amnb

amnbc

amnmnmnanb

asb

adb

‘dongzi‘

love is like 

like is love

几种有用的正则表达式
项目正则表达式
匹配正规文本中的单词

\b[[:alpha:]]\+\b(b是单词的边界

^[[:alpha:]]*$(注意此处的*不能换成?由于匹配长短问题,?是最短匹配)

可以匹配出空白行。

^[[:alpha:]]+$就匹配不出空白行。

(^| )["({[]*book[]})"?,.:;!‘s ]*( |$)
匹配空行^$
匹配含有空格的空白行和空行^空格*$
匹配整个行^.*$
匹配一个或多个空格空格空格*
匹配s前面含有任意abc随机组合的字符串[abc]*s
匹配格式化的美元数额\$[空格0-9]*\.[0-9][0-9]
匹配电子邮件地址[[:alnum:]]*\@[[:alnum:]]*\.[[:alnum:]]\{2,4\}$
匹配一个HTTP URLhttp://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}


本文出自 “天道酬勤” 博客,谢绝转载!

linux笔记三 --正则表达式