这是一篇关于正则表达式的文档,如果你是Linux系统管理员,那么你一定离不开它(正则表达式)了,
它可能出现在 grep/more/less/man/vi(m)/sed/awk/apache/nginx/haproxy 等等与linux 系统相关的地方,所以掌握正则表达式对于linux系统管理员很重要!
 
 
一 什么是正则表达式?
正则表达式是一种表示方式,让你可以查找匹配特定规则的文本
 
二 正则表达式分两类
1 BRE 基本正则表达式(Basic Regular Expression)
2 ERE 扩展正则表达式(Extended Regular Expression)
 
三 正则表达式由两部分组成
正则表达式由两部分组成,一般字符与特殊字符
1 一般字符,指的是没有任何特殊意义的字符,比如 abcdef123456等等用于表示其自身
2 特殊字符,又称为元字符(metacharacter),见下表 
POSIX BRE 与 ERE 元字符表

   
   
   
   
  1. 字符     BRE/ERE   模式含义 
  2. \        两者均可   关闭后边元字符的特殊意义 
  3. .          :        匹配任意单个字符,但换行符除外 
  4. *          :        匹配在它之前的重复任意次数的单个字符(包括0次,没有匹配) 
  5. ^          :        匹配紧接着的正则表达式,在行手或者字符串的起始处 
  6. $          :        匹配前面的正则表达式,在行尾后者字符串结尾处 
  7. [...]      :        匹配方括号内的任意字符,方括号内包含 - 连字符表示范围,^(第一位)表示取反 
  8. \{n,m\}    BRE      区间表达式,匹配在它前面的单个字符重复区间次数,1至9次;5次;1,至少1次 
  9. \( \)      BRE      后向引用,第一步将子表达式放在 \( 与 \)里,最多9个子表达式 
  10. \n         BRE      后向引用,第二步使用匹配的子表达式,如 \1,后向引用用于查找重复字,以及匹配引号时特别好用,如\(["']\).*\1,匹配单引号或者双引号括起来的子. 
  11. {n,m}      ERE      区间表达式与BRE相比少了反斜杠 
  12. +          ERE      匹配前面的正则表达式的一次或者多次 
  13. ?          ERE      匹配前面的正则表达式的一次或者零次 
  14. |          ERE      匹配|符号前或者后的正则表达式 
  15. ()         ERE      匹配使用括号括起来的正则表达式群  


四 正则表达式的优先级
正则表达式的优先级,指的是某个运算符根据优先级高低,将优先处理

   
   
   
   
  1. 1 BRE 优先级(由高至低) 
  2. 运算符               含义 
  3. [..] [==] [::]      用于字符排序的方括号符号 
  4. \metacharacter   转义的元字符 
  5. [ ]                方括号表达式 
  6. \( \) \digit     子表达式与后向引用 
  7. * \{ \}            重复前置的单个字符 
  8. 无符号             连续的字符 
  9. ^ $               锚点 
  10.   
  11. 2 ERE 优先级(由高至低) 
  12. 运算符              含义 
  13. [..] [==] [::]     用于字符排序的方括号符号 
  14. \metacharacter   转义的元字符 
  15. [ ]                方括号表达式 
  16. ( )                分组 
  17. * + ? {}           重复前置的正则表达式 
  18. 无符号             连续的字符 
  19. ^ $                锚点 
  20. |                  交替  


五 BRE 与 ERE 的不同
BRE 与 ERE 在大多数的元字符与功能应用上几乎是完全一致的,但是ERE里有些元字符看起来与BRE类似,却具有完全不同的意义
1 匹配单个字符;
ERE与BRE基本一致,比如一般字符,用于转义的反斜杠,以及方括号表达式
2 ERE中不存在后向引用;
圆括号在ERE中表示分组,而\( \)在ERE中表示匹配左括号与右括号
3 匹配单个表达式与多个正则表达式
ERE在匹配多字符这方面与BRE有很明显的不同(*处理方式上除外),比如 区间表达式不在需要使用反斜杠,而 ? 与 + 元字符可以更细腻的匹配控制
4 BRE中没有交替与分组
与BRE不同ERE中拥有交替字符"|",用于匹配多个字符序列,比如 one|two|three|four ;
同上,ERE拥有分组"()",用于表达式群,比如 (one)+ 用于匹配一个或多个连续的one ;
组合使用,如 this is (one|two) 或者 this is (one|two)* 匹配0个或多个one 或者 two;
5 停驻文本匹配(锚点)
"^"与"$" 在 BRE与 ERE表示的意义是相同的,需要注意的是它们在方括号表达式中将会失去它们的特殊意义;
组合使用,如 this is ^(one|two)$ 匹配one 或者 two 
 
六 额外的GNU表达式运算符

   
   
   
   
  1. 运算符           含义 
  2. \w            匹配任何单词 
  3. \W            匹配任何非单词 
  4. \< \>           匹配单词的起始或结尾 
  5. \b            匹配单词的起始或结尾处,所找到的空字符串  
  6. ..... 


  七 简单例子

   
   
   
   
  1. 1 sed 
  2. sed -r 's\|[ ]*//g' 
  3. sed -r 's/[ ]+//g;s/^\||\|$//g' variables      (注意 g 全局替换,如果不是用g 将只匹配每行的第一个) 
  4. sed -r 's/[ ]+//g;s/(^\|)|(\|$)//g' variables   (注意 ()分组 与没有使用括号分组,完成的功能一样) 
  5. sed -r 's/\|[ ]//g;s/[ ]*\|$//g' variables 
  6. sed -r 's/([ ]+)?\|//g;s/ //;/\+/d' variables    
  7. sed -re 's/(\|)//g' variables | sed -e 's/[ ]\{2,\}/ /g'  | sed -e '/^\+.*/d' 
  8. sed -rf sed.sed variables  
  9. cat sed.sed  
  10. s/(\|)//g 
  11. s/[ ]{2,}/ /g 
  12. /^\+.*/d  
  13. s/^( )|( )$//g 
  14.  
  15. 2 vim 
  16. :10,$ s/^[\t]*/ /            #行头所有换行符,用空格替换 
  17. :10,30 s/^[ ]*/ /            #行头有多个空格,用一个空格替换 
  18. :10,30 g/^ *$/d              #删除空行 
  19. :10,20 s/[#].*/ /            ##号后边的任意位字符串,用一个空格替换 
  20. :6,9 s/^[ ]//                #行头空格删掉! 
  21. :1,$ s/\\n//                 #\n 删掉! 
  22. :1,$ s/^[ ]// 
  23. :10,20 s/[ ]\{2,\}//         #重复两次以上的空格,删掉! 
  24. :7,20 s/^/echo "/ 
  25. :7,20 s#$#\" >> /etc/rsyncd.conf# 分隔符是#,每行后添加 " >> /etc/rsyncd.conf 
  26. :6,20 s/^/  /                #行头添加俩个空格,注意 中间有俩空格! 
  27. :% s/^/#/g                   #每行前添加#号,如果每行尾添加则^变成$即可,%表示全文! 
  28.  
  29. :% s/\(\d\+\.\)\{3\}\d\+//g  #去掉 ip 地址(10.0.0.1) 
  30. # 1. #!/bin/sh                #空白为 空格 
  31.  ..... 
  32.                                                    31. done  #空白为 tab 
  33. :% s/^\s\{2,\}\d\+\.//g      #替换开头为空白或者tab ifs字符至少重复两次以上,接数字至少重复一次,接.号,全局替换   
  34. # [url]com[/url]             
  35. :% s#\[url\]\|\[/url\]##g    #替换 [url]或者[/url],注意 \| 表示或者  

 sed 杂记 20120606

   
   
   
   
  1. [root@linux ~]# sed [-nefr] [动作] 
  2. 参数∶ 
  3. -n  ∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 
  4.       的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过 
  5.       sed 特殊处理的那一行(或者动作)才会被列出来。 
  6. -e  ∶直接在指令列模式上进行 sed 的动作编辑; 
  7. -f  ∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 
  8.       sed 动作; 
  9. -r  ∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法) 
  10. -i  ∶直接修改读取的档案内容,而不是由萤幕输出。 
  11.  
  12. 动作说明∶  [n1[,n2]]function 
  13. n1, n2 ∶不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 
  14.          是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 
  15.  
  16. function 有底下这些咚咚∶ 
  17. a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ 
  18. i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); 
  19. c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! 
  20. d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚; 
  21. p   ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~ 
  22. s   ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配 
  23.       正规表示法!例如 1,20s/old/new/g 就是啦! 
  24.  
  25. sed替换(WWW换成WEB) 
  26.  
  27. sed -ri 's/(COMPILE_INITS=).*/\10/' /install/ghostscript-8.63/Makefile (选项 -r 使用扩展正则表达式) 
  28.  
  29. sed -i 's/WWW/WEB/' dd.txt  (匹配 WWW 用 WEB代替) 
  30.  
  31. sed -i "s/^/''/g" one.txt   (注意 单引号与双引号,匹配每一行,把'' 添加到 行头部!) 
  32.  
  33. sed -i 's/.*index.html/DirectoryIndex index.html index.htm index.php/' /usr/local/apache/conf/httpd.conf 
  34. sed -i '/AddType application\/x-gzip .gz .tgz/a\    AddType application\/x-httpd-php .php' /usr/local/apache/conf/httpd.conf    
  35.    (注意 a\  在匹配这行之下添加一行!) 
  36. sed -i '/export/a export PATH=$PATH:/usr/local/apache/bin' /etc/profile (别忘了 source /etc/profile) 
  37.  
  38. sed -n '/.*index.html/p' /usr/local/apache/conf/httpd.conf  (.*捡破烂模式) 
  39. sed -n '/\/usr\/local.*\/bin/p' /etc/profile 
  40. sed -i '/\/usr\/local.*\/bin/d' /etc/profile 
  41. sed -n '/\/usr\/local\/.*/p' /etc/ld.so.conf 
  42.  
  43. sed -n '/bz-clone/p' /etc/hosts 
  44. 127.0.0.1bz-clone.test.com bz-clone localhost.localdomain localhost 
  45. sed -i 's/bz-clone/cl3/g' /etc/hosts                         (注意 g 全局替换,如果不是用g 将只匹配每行的第一个) 
  46. 127.0.0.1cl3.test.com cl3 localhost.localdomain localhost 
  47.  
  48. sed -n 's/^#/shell>/p' sed.txt                                ()  
  49. sed -n 's/^#/shell>/p' sed.txt 
  50. sed -i 's/^#/shell>/' sed.txt 
  51.  
  52. sed -n '/^ $/p' sed.txt                                       
  53. sed -n '/^ $/d' sed.txt                                       (注意 d 删除匹配这行) 
  54. sed -r '/^sda/d' test1                                        d 删除^sda行 
  55. sed -i '/^ $/d' sed.txt  
  56.  
  57. sed -n '/shell>/p' sed.txt 
  58. sed '/shell>/i\ ' sed.txt 
  59. sed -i '/shell>/i\ ' sed.txt                                  (注意 i\ 在匹配这行之上添加一行!) 
  60.  
  61. sed '1 d' test 
  62. sed '1,2 d' test  
  63.  
  64. sed -rn 's/[0-9 \t]+//p' a.txt 
  65. bbb        [ESXI]        10.0.0.1                10.0.0.2        DELL R910        SJHL        E7520*1.86GHz*4/300G*4/32G 
  66.  
  67.  
  68. | Uptime                     | 325453     | 
  69. | Uptime_since_flush_status  | 325453     | 
  70. sed -r 's\|[ ]*//g' 
  71. sed -r 's/[ ]+//g;s/^\||\|$//g' variables      (注意 g 全局替换,如果不是用g 将只匹配每行的第一个) 
  72. sed -r 's/[ ]+//g;s/(^\|)|(\|$)//g' variables   (注意 ()分组 与没有使用括号分组,完成的功能一样) 
  73. sed -r 's/\|[ ]//g;s/[ ]*\|$//g' variables 
  74. sed -r 's/([ ]+)?\|//g;s/ //;/\+/d' variables    
  75. sed -re 's/(\|)//g' variables | sed -e 's/[ ]\{2,\}/ /g'  | sed -e '/^\+.*/d' 
  76. sed -rf sed.sed variables  
  77. cat sed.sed  
  78. s/(\|)//g 
  79. s/[ ]{2,}/ /g 
  80. /^\+.*/d  
  81. s/^( )|( )$//g 
  82.  
  83. (感慨 ) 
  84. sed -in '$d' /etc/rc.local          (注意 $ 最后一行) 
  85. sed -r 's/(1.)|(2.)//g' en.txt | sort -n > tmp 
  86. sed '/export/ a\export PATH=$PATH:/usr/local/subversion/bin' /etc/profile (这不是我想要的,在每一个export行,添加新的) 
  87. sed '61,/export/ a\export PATH=$PATH:/usr/local/subversion/bin' /etc/profile (61, 为限定第61行) 
  88. sed '$,/export/ a\export PATH=$PATH:/usr/local/subversion/bin' /etc/profile  (注意 $ 最后一行) 
  89. sed -i '$ a\/usr/local/apr-util/lib' /etc/ld.so.conf                         (在最后一行添加一行文本) 
  90. sed -ri '/^$/d;s/(^[ \t]+)//g;' /var/www/rsync/rsync_file.list               #-r拓展正则表达式,-i直接替换