• 正则表达式
  • 特殊字符
  • POSIX特殊字符

1.1 正则表达式介绍

正则表达式(regular expression)是一种文本匹配模式,包括普通字符(例如,a到 z 之间的字母)和特殊字符(称为”元字符”),它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串,将匹配的子串替换或者从某个字符串中取出某个条件的子串。
正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符将来生成一个匹配对应字符串的公式,用词来从海量数据中匹配出自己想要的数据。
正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、PYTHON、java、js等
shell也支持正则表示大师,但不是所有的命令都支持正则表达式,常用的命令中只有 grep、sed、awk 命令支持正则表达式。
并不是 shell 特有的。

特殊说明

  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. ccc
  20. dddd
  21. http//www
  22. abababab
  23. c c d
  24. 123
  25. a3c
  26. e*f

1.2 特殊字符

1.2.1 定位符

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

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

1.2.2 匹配符

匹配符 说明
. 匹配除回车以外的任意字符
() 字符串分组
[] 定义字符类,匹配括号范围内的一个字符
[^] 表示否定括号中出现字符类中的字符,取反
\ 转义字符
|
  1. 1)精确匹配 a开头c结尾中间为任意一个字符
  2. [root@localhost shell_14]# egrep "^a.c$" file
  3. acc
  4. abc
  5. a_c
  6. aZc
  7. a c
  8. a3c
  9. 2)精确匹配 a开头c结尾中间为09的任意一个数字
  10. [root@localhost shell_14]# egrep "^a[0-9]c$" file
  11. a3c
  12. 3)精确匹配 a开头c结尾中间为除了09的任意字符
  13. [root@localhost shell_14]# egrep "^a[^0-9]c$" file
  14. acc
  15. abc
  16. a_c
  17. aZc
  18. a c
  19. 4)精确匹配 a开头c结尾中间为*的字符
  20. [root@localhost shell_14]# egrep "^a\*c$" file
  21. a*c
  22. 5)精确匹配 ab开头c结尾中间
  23. [root@localhost shell_14]# egrep "^(a|b)c$" file
  24. ac
  25. bc

1.2.3 限定符

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

限定符 说明
* 某个字符之后加型号表示该字符不出现或出现多次
与星号相似,但略有变化,表示该字符出现一次或不出现
+ 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
{n,m} 某个字符之后出现,表示该字符最少n次,最多m次
{m} 正好出现了m次
  1. 1b可以不出现或出现多次
  2. [root@localhost shell_14]# egrep "^ab*c$" file
  3. ac
  4. abbc
  5. abbbc
  6. abbbbbc
  7. abc
  8. 2b可以不出现或出现一次
  9. [root@localhost shell_14]# egrep "^ab?c$" file
  10. ac
  11. abc
  12. 3)必须有b可以有一次或多次
  13. [root@localhost shell_14]# egrep "^ab+c$" file
  14. abbc
  15. abbbc
  16. abbbbbc
  17. abc
  18. 4b出现一到五次
  19. [root@localhost shell_14]# egrep "^ab{1,5}c$" file
  20. abbc
  21. abbbc
  22. abbbbbc
  23. abc
  24. 5b出现三次
  25. [root@localhost shell_14]# egrep "^ab{3}c$" file
  26. abbbc

1.3 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. [root@localhost shell_14]# egrep "^a[[:alnum:]]c$" file
  2. acc
  3. abc
  4. aZc
  5. a3c

1.4 正则注意事项

  • 所有符号英文符号
  • 学习正则,通过 grep 命令学习, grep 加上单引号
  • 给 grep ,egrep 加上颜色,alias=’grep —color=auto’ alias egrep=’egrep —color=auto’
  • 注意系统的字符集: en_US.UTF-8(大部分情况下没问题),如果出现问题修改字符集为C export LANG=C
  • 快速掌握正则:配合grep -o 参数学习

1.5 正则 VS 通配符

分类 诞生目标(用途) 支持的命令
正则(regular expression) 三剑客,高级语言,进行过滤(匹配字符) 三剑客grep,sed,awk find,rename(ubuntu),expr
通配符(pathname extension 或 glob) 匹配文件(文件名).txt 。log {01..10} Linux 下面大部分命令都支持

Shell常见通配符

通配符 含义 实例
* 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
匹配任意一个字符 a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
[list] 匹配 list 中的任意单一字符 a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list]或[^list] 匹配 除list 中的任意单一字符 a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。
[c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b。
[!c1-c2]或[^c1-c2] 匹配不在c1-c2的任意字符 a[!0-9]b 如acb adb
{string1,string2,…} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b 列出aabcb,axyzb,a123b