shell-正则表达式

  • 正则表达式介绍

  • 特殊字符

  • POSIX特殊字符



一、正则表达式介绍

正则表达式是一种文本模式匹配,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个字符串中取出某个条件的子串。

正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符来生成一个匹配对应字符串的公式,用此来从海量数据中匹配出自己想要的数据。

正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!

shell也支持正则表达式,但不是所有的命令都支持正则表达式,常见的的命令中只有grep、sed、awk命令支持正则表达式。

特殊说明


  1. 测试数据: #cat file
  2. ac
  3. ab
  4. abbc
  5. abcc
  6. aabbcc
  7. abbbc
  8. abbbbbc
  9. acc
  10. abc
  11. asb
  12. aa
  13. bb
  14. a_c
  15. aZc
  16. aAAAAc
  17. a c
  18. ABC
  19.  
  20. ccc
  21.  
  22. dddd
  23. http://www
  24. abababab
  25. c c d
  26. 123
  27. a3c
  28. e*f

二、特殊字符

定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头和结尾,做模糊匹配。
 

定位符 说明
^ 锚定开头 ^a 以a开头 默认锚定一个字符
$ 锚定结尾 a$ 以a结尾 默认锚定一个字符

测试案例


  1. 1)精确匹配 以a开头c结尾的字符串
  2. [root@www ~]# egrep "^ac$" file
  3. ac
  4.  
  5. 2)模糊匹配 以a开头
  6. [root@www ~]# egrep "^a" file
  7. ac
  8. ab
  9. abbc
  10. abcc
  11. aabbcc
  12. abbbc
  13. abbbbbc
  14. acc
  15. abc
  16. asb
  17. aa
  18. a_c
  19. aZc
  20. aAAAAc
  21. a c
  22. abababab
  23. a3c
  24.  
  25.  
  26. 3)模糊匹配 以c结尾的字符串
  27. [root@www ~]# egrep "c$" file
  28. ac
  29. abbc
  30. abcc
  31. aabbcc
  32. abbbc
  33. abbbbbc
  34. acc
  35. abc
  36. a_c
  37. aZc
  38. aAAAAc
  39. a c
  40. ccc
  41. a3c

匹配符:匹配字符串

 

匹配符 说明
. 匹配除回车以外的任意字符
( ) 字符串分组
[ ] 定义字符类,匹配括号中的一个字符
[ ^ ] 表示否定括号中出现字符类中的字符,取反。
\ 转义字符
\  

测试案例



  1. 1)精确匹配 以a开头c结尾 中间任意 长度为三个字节的字符串
  2. [root@www ~]# egrep "^a.c$" file
  3. acc
  4. abc
  5. a_c
  6. aZc
  7. a c
  8. a3c
  9.  
  10. 2)模糊匹配 以cc结尾的字符串 因为$只能锚定单个字符,如果是一个字符串就需要用()来做定义
  11. [root@www ~]# egrep "(cc)$" file
  12. abcc
  13. aabbcc
  14. acc
  15. ccc
  16.  
  17. 3)精确匹配 以a开头c结尾 中间是a-z,0-9 长度为三个字节的字符串
  18. [root@www ~]# egrep "^a[a-z0-9]c$" file
  19. acc
  20. abc
  21. a3c
  22.  
  23. 4)精确匹配 以a开头c结尾 中间不包含a-z,0-9 长度为三个字节的字符串
  24. [root@www ~]# egrep "^a[^a-z0-9]c$" file
  25. a_c
  26. aZc
  27. a c
  28.  
  29. 5)精确匹配 以e开头f结尾 中间是*号 长度为三个字节的字符串 e*f
  30. [root@www ~]# egrep "^e\*f$" file
  31. e*f
  32.  
  33. 6)精确匹配 以a开头b或c结尾 中间是任意 长度为三个字节的字符串
  34. [root@www ~]# egrep "^a.(b|c)$" file
  35. acc
  36. abc
  37. asb
  38. a_c
  39. aZc
  40. a c
  41. a3c

限定符:对前面的字符或者字符串做限定说明
 

限定符 说明
* 某个字符之后加星号表示该字符不出现或出现多次
与星号相似,但略有变化,表示该字符出现一次或不出现
+ 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
{n,m} 某个字符之后出现,表示该字符最少n次,最多m次
{m} 正好出现了m次

测试案例

  1. 1)精确匹配 以a开头 c结尾 中间是有b或者没有b 长度不限的字符串
  2. [root@www ~]# egrep "^ab*c$" file
  3. ac
  4. abbc
  5. abbbc
  6. abbbbbc
  7. abc
  8.  
  9. 2)精确匹配 以a开头 c结尾 中间只出现一次b或者没有b的字符串
  10. [root@www ~]# egrep "^ab?c$" file
  11. ac
  12. abc
  13.  
  14. 3)精确匹配 以a开头 c结尾 中间是有b且至少出现一次 长度不限的字符串
  15. [root@www ~]# egrep "^ab+c$" file
  16. abbc
  17. abbbc
  18. abbbbbc
  19. abc
  20.  
  21. 4)精确匹配 以a开头 c结尾 中间是有b且至少出现两次最多出现四次 长度不限的字符串
  22. [root@www ~]# egrep "^ab{2,4}c$" file
  23. abbc
  24. abbbc
  25.  
  26. 5)精确匹配 以a开头 c结尾 中间是有b且正好出现三次的字符串
  27. [root@www ~]# egrep "^ab{3}c$" file
  28. abbbc
  29.  
  30. 6) 精确匹配 以a开头 c结尾 中间是有b且至少出现一次的字符串
  31. [root@www ~]# egrep "^ab{1,}c$" file
  32. abbc
  33. abbbc
  34. abbbbbc
  35. abc

三、POSIX特殊字符

 

特殊字符 说明
[:alnum:] 匹配任意字母字符0-9 a-z A-Z
[:alpha:] 匹配任意字母,大写或小写
[:digit:] 数字 0-9
[:graph:] 非空字符( 非空格控制字符)
[:lower:] 小写字符a-z
[:upper:] 大写字符A-Z
[:cntrl:] 控制字符
[:print:] 非空字符( 包括空格)
[:punct:] 标点符号
[:blank:] 空格和TAB字符
[:xdigit:] 16 进制数字
[:space:] 所有空白字符( 新行、空格、制表符)

测试案例



  1. 注意[[ ]] 双中括号的意思: 第一个中括号是匹配符[] 匹配中括号中的任意一个字符,第二个[]是格式 如[:digit:]
  2.  
  3. 1)精确匹配 以a开头c结尾 中间a-zA-Z0-9任意字符 长度为三个字节的字符串
  4. [root@www ~]# egrep "^a[[:alnum:]]c$" file
  5. acc
  6. abc
  7. aZc
  8. a3c
  9.  
  10. 2)精确匹配 以a开头c结尾 中间是a-zA-Z任意字符 长度为三个字节的字符串
  11. [root@www ~]# egrep "^a[[:alpha:]]c$" file
  12. acc
  13. abc
  14. aZc
  15.  
  16.  
  17. 3)精确匹配 以a开头c结尾 中间是0-9任意字符 长度为三个字节的字符串
  18. [root@www ~]# egrep "^a[[:digit:]]c$" file
  19. a3c
  20.  
  21. 4)精确匹配 以a开头c结尾 中间是a-z任意字符 长度为三个字节的字符串
  22. [root@www ~]# egrep "^a[[:lower:]]c$" file
  23. acc
  24. abc
  25.  
  26.  
  27. 4)精确匹配 以a开头c结尾 中间是A-Z任意字符 长度为三个字节的字符串
  28. [root@www ~]# egrep "^a[[:upper:]]c$" file
  29. aZc
  30.  
  31. 5)精确匹配 以a开头c结尾 中间是非空任意字符 长度为三个字节的字符串
  32. [root@www ~]# egrep "^a[[:print:]]c$" file
  33. acc
  34. abc
  35. a_c
  36. aZc
  37. a c
  38. a3c
  39.  
  40. 6)精确匹配 以a开头c结尾 中间是符号字符 长度为三个字节的字符串
  41. [root@www ~]# egrep "^a[[:punct:]]c$" file
  42. a_c
  43.  
  44. 7)精确匹配 以a开头c结尾 中间是空格或者TAB符字符 长度为三个字节的字符串
  45. [root@www ~]# egrep "^a[[:blank:]]c$" file
  46. a c
  47.  
  48. 类似
  49. [root@www ~]# egrep "^a[[:space:]]c$" file
  50. a c
  51.  
  52. 8)精确匹配 以a开头c结尾 中间是十六进制字符 长度为三个字节的字符串
  53. [root@www ~]# egrep "^a[[:xdigit:]]c$" file
  54. acc
  55. abc
  56. a3c

说明:特殊字符和POSIX字符是两套字符,都可以完成需要的匹配,大家学习的时候最少要记住一套字符并熟练应用。

 

job

案例一 匹配合法的IP地址

grep ‘^((25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?).){3}(25[0-5]|2[0-4][[:digit:]]|[01]?[[:digit:]][[:digit:]]?)$’ —color ip_base

案例二 匹配座机电话号码

egrep “^[[:graph:]]{12}$” number |egrep “^(0[1-9][0-9][0-9]?)-[1-9][0-9]{6,7}$”


  • 作者:合十
  • 发表时间:2021年9月4日 03:38
  • 更新时间:2024年3月29日 00:31
  • 所属分类:Shell脚本编程

Comments

该文章还未收到评论,点击下方评论框开始评论吧~