【07】正则表达式入门

3 阅读1分钟

[26/3/16]正则表达式入门

请一定要把正则表达式和通配符分开!!!

通配符

  • * :通常代表“任意多个字符(包括 0 个)”
  • ? :通常代表“任意单个字符”
  • [list]:指定范围内的单个字符
  • [a-b] :a 到 b 的所有字符,例如 [0-9]
  • [^ ] :反向选择

不支持正则表达式的程序会以通配符来解析,例如:

ls -l * 表示任意文件名的文件

ls -l a* 表示任意以 a 开头的文件名

如果要用正则表达式筛选 a 开头的文件名:

ls | grep -n '^a.*'


基础的正则

  1. 以 x 为行开头:^x
  2. 以 x 为行结尾:x$
  3. 任意的一个(且一定是一个)字符:.
  4. 0 到无穷个 x:x*
  5. 转义符号:``
  6. 可以是列表里的任意一个:[list]
  7. 范围列表:[n1-n2]
  8. 不可以是列表里的任意一个:[^liset]
  9. x 字符可以重复 n 次,其中 a<=n<=b:x{a,b}(注意有时你需要使用转义符号才能使用{},也就是 x{a,b}

一些实例

  1. t[ae]st:匹配 tast 或者 test
  2. [^g]oo:匹配不以 g 开头的 oo
  3. [^a-z]oo:匹配不以小写字母开头的 oo
  4. ^the:匹配作为一行开头的 the
  5. ^[a-zA-Z0-9] :匹配行一开头为数字或者大小写字母
  6. .$ :匹配行最后为.的内容,因为.本身是特殊字符所以要转义
  7. ^$ :空白行,因为没有内容所以开头和结尾是连到一起的
  8. g..d:匹配 g??d,就是中间必须有两个任意字符
  9. oo*:至少一个 o 的连续 o,注意这里,由于*可表示 0 个前一字符!
  10. g.*g:两个 g 中间可以有任意东西,也可以没有东西!
  11. o{2,5}:匹配 2 到 5 个连续的 o

搭配工具

  1. sed :可以将数据进行替换、删除、新增、选取特定行(通常用于一整行的处理)
  2. awk :一次处理一行,通常用于把一行分为多个字段来处理
  3. diff :比对两个文本文件(或文件夹)内容的不同(按行来比较)
  4. cmp :按字节来比较两个文件的不同
  5. patch :和 diff 搭配使用,用于更新旧的文件
  6. pr :文件打印设置

扩展正则表达式

首先,grep 命令不支持扩展的正则表达式

其次,如果希望使用正则表达式,可以使用 egrep 或者 grep -E

例子:删除空白行和行首为 # 的行

不使用扩展正则:grep -v '^$' filename.txt | grep -v '^#'

使用扩展正则:egrep -v '^$|^#' 这里的 | 表示或运算

扩展正则符号表:

RE 字符含义
+对前面一个字符,要求重复【至少一次】比如 go+d 最小可以查找到 god
?对前面一个字符,要求出现【0 或 1 次】比如 go?d 可以查找 gd 或者 god
|或运算符
()群组字符串比如 g(la|oo)d 可以匹配 glad 和 good
()+多个重复群组比如 A(xyz)+C 可以匹配 AxyzxyzC 这种