17 正则表达式(重点)

正则表达式是一种符号表示法,被用来识别文本模式。在某种程度上,它们与匹配文件和路径名的shell通配符比较相似,但其规模更庞大。

一、grep程序——在文本文件中查找一个指定的正则表达式,并把匹配行输出到标准输出

-i 忽略大小写
-v 不匹配
-c 打印匹配数量而不是文本本身
-l 打印包含匹配项的文件名
-L 相似-l,但只打印不包含匹配项的文件名
-n 在每个匹配行之前打印出其位于文件中的相应行号
-h 对应于多文件搜索,不输出文件名

 二、正则表达式的元字符

                ^ $ . [] {} - ? * + () |  

(1) .圆点字符,用来匹配任意字符

               如果我们在正则表达式中包含它,它将会匹配在此位置的任意一个字符。  

huiubantu@ubuntu:~$ grep -h '.zip' dirlist*.txt   会输出类似binzip2   bzip2 gzip

(2)^插入符号和$美元符号会被看做是锚(定位点)

              这意味着正则表达式只有在文本行的开头或末尾被找到时,才算发生一次匹配。

huiubantu@ubuntu:~$ grep -h '^zip' dirlist*.txt      会输出类似zip zipcloak zipgrep zipinfo,就是说前边被占有,不能匹配
huiubantu@ubuntu:~$ grep -h 'zip$' dirlist*.txt      会输出类似bzip binzip lockzip,就是说后边已被占有,不能匹配上字符

(3)中括号表达式和字符类

    通过使用中括号[],我们能够从一个指定的字符集合中匹配一个单个的字符

huiubantu@ubuntu:~$ grep -h '[bg]zip' dirlist*.txt   会输出bzip bzip2recover gzip2 

    如果在正则表示式中的第一个字符(否则不生效)是一个插入字符,则剩余的字符被看作是不会在给定的字符位置出现的字符集合。

huiubantu@ubuntu:~$ grep -h '[^bg]zip' dirlist*.txt  会输出bunzip2 funzip

(4)传统的字符区域,用-简写

如,在我们的列表中找到每个以大写字母开头的文件,以下边这种方式写比较麻烦

huiubantu@ubuntu:~$ grep -h '^[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' dirlist*.txt   

      我们可以用一个三字符区域来缩写26个字母,如下

huiubantu@ubuntu:~$ grep -h '^[A-Z]' dirlist*.txt

另外,比较以下两种写法:

huiubantu@ubuntu:~$ grep -h '[A-Z]' dirlist*.txt   输出包含一个大写字母的文件名
huiubantu@ubuntu:~$ grep -h '[-AZ]' dirlist*.txt   输出表达式中包含一个连字符或者大写字母A或者大写字母Z的文件名

 三、POSIX字符集

   UNIX刚开发时,使用ASCII字符,ASCII字符中,前32个字符(数字0-31)是控制码(例如tabs,backspaces,和回车),再有32个字符(32-63)包含打印字符,包含大多数的标点符号和数字0到9;再随后的32个字符(64-95)包含大写字符和一些更多的标点符号。最后的31个字符(96-127)包含小写字母和更过的标点符号。

系统使用这种排序规则的ASCII:  ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

                  正常的字典顺序: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ

POSIX标准介绍了locale,可以被调整来为某个特殊的区域,选择所需的字符集。

1.POSIX相融的应用程序将会使用字典排列顺序而不是ASCII顺序

huiubantu@ubuntu:~$ echo $LANG
en_US.UTF-8

2.将字典顺序恢复为ASCII顺序

                      改变LANG的值,将其设置为POSIX

3.POSIX字符集

[:alnum:] 字母数字字符,在ASCII中,等价与:[A-Za-z0-9]
[:word:] 通上,增加了下划线字符
[:alpha:] 字母字符,在ASCII中,等驾驭:[A-Za-z]
[:blank:] 包含空格和 tab 字符。
   
   
   
   
   
   

四、POSIX基本的Vs.扩展的正则表达式

    POSIX分类:基本正则表达式(BRE)和扩展正则表达式(ERE)

          BRE的元字符      ^ $ . [] *    其他被认为是文本文件

          ERE的元字符      ^ $ . [] *  () {} ? + |

         在 BRE 中,字符 (, ), {,和 } 用反斜杠转义后,被看作是元字符, 相反在 ERE 中,在任意元字符之前加上反斜杠会导致其被看作是一个文本字符。

  1.alternation(交替)

huiubantu@ubuntu:~$ echo "AAA" | grep AAA
AAA
huiubantu@ubuntu:~$ echo "BBB" | grep AAA

     使用交替

huiubantu@ubuntu:~$ echo "AAA" | grep -E 'AAA|BBB'  这个正则表达式用单引号引起来,为的是阻止 shell 把竖杠线元字符解释为一个 pipe 操作符
AAA
huiubantu@ubuntu:~$ echo "BBB" | grep -E 'AAA|BBB'
BBB
huiubantu@ubuntu:~$ echo "CCC" | grep -E 'AAA|BBB'

2.()来分离alternation

huiubantu@ubuntu:~$ grep -Eh '^(bz|gz|zip)' dirlist*.txt
huiubantu@ubuntu:~$ grep -Eh '^bz|gz|zip' dirlist*.txt

3.?限定符——匹配一个元素零次或一次

huiubantu@ubuntu:~$ "(555) 123-4567" | grep -E '^(?[0-9][0-9][0-9])? [0-9][0-9]$'
(555) 123-4567: command not found
huiubantu@ubuntu:~$ "(555) 123-4567" | grep -E '^(?[0-9][0-9][0-9])? [0-9][0-9][0-9][0-9][0-9]$'
(555) 123-4567: command not found

4.+限定符——匹配一个元素一次或多次

5.{}限定符——匹配一个元素特定的次数

原文地址:https://www.cnblogs.com/xiaoxiaohui2015/p/5792603.html