正则表达式是一种符号表示法,被用来识别文本模式。在某种程度上,它们与匹配文件和路径名的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.{}限定符——匹配一个元素特定的次数