正则表达式

正则表达式就是由一系列特殊字符组成的字符串, 其中每个特殊字符都被称为元字符。一个正则表达式会包含下列一项或多项:
1. 一个字符集. 这里所指的字符集只包含普通字符, 这些字符只表示它们的字面含义. 正则表达式的最简单形式就是只包含字符集, 而不包含元字符.
2. 锚. 锚指定了正则表达式所要匹配的文本在文本行中所处的位置. 比如, ^, 和$就是锚.
3. 修饰符. 它们扩大或缩小(修改)了正则表达式匹配文本的范围. 修饰符包含星号, 括号, 和反斜杠.

星号 -- *-- 用来匹配它前面字符的任意多次, 包括0次.

点 -- .-- 用于匹配任意一个字符, 除了换行符.

脱字符号 -- ^-- 匹配行首, 但是某些时候需要依赖上下文环境, 在RE中, 有时候也表示对一个字符集取反.

美元符 -- $-- 在RE中用来匹配行尾.

中括号 -- [...]-- 在RE中, 将匹配中括号字符集中的某一个字符.

反斜杠 -- -- 用来转义某个特殊含义的字符, 这意味着, 这个特殊字符将会被解释为字面含义.

转义的"尖括号"-- <...>-- 用于匹配单词边界.尖括号必须被转义才含有特殊的含义, 否则它就表示尖括号的字面含义."<the>"完整匹配单词"the", 不会匹配"them", "there", "other", 等等。

转义小括号表示分组,转义大括号表范围。基本正则没有竖线|

转义"大括号"-- { }-- 在转义后的大括号中加上一个数字, 这个数字就是它前面的RE所能匹配的次数."[0-9]{5}"精确匹配5个数字 。

扩展的正则表达式. 添加了一些额外的匹配字符到基本集合中. 用于egrep, awk, 和Perl.

问号 -- ?-- 匹配它前面的字符, 但是只能匹配1次或0次. 通常用来匹配单个字符.

加号 -- +-- 匹配它前面的字符, 能够匹配一次或多次. 与前面讲的*号作用类似, 但是不能匹配0个字符的情况.

GNU版本的sed和awk能够使用"+", 但是它需要被转义一下.
echo a111b | sed -ne '/a1+b/p'
echo a111b | grep 'a1+b'
echo a111b | gawk '/a1+b/'  # 上边3句的作用相同.

貌似没有后向引用。

大括号,{2},{2,},{2,5}

圆括号 -- ( )-- 括起一组正则表达式. 当你想使用expr进行子字符串提取(substringextraction)的时候, 圆括号就有用了. 如果和下面要讲的"|"操作符结合使用, 也非常有用.

竖线 -- |-- 就是RE中的"或"操作符, 使用它能够匹配一组可选字符中的任意一个.egrep 're(a|e)d' misc.txt

与GNU工具一样, 某些版本的sed, ed, 和ex一样能够支持扩展正则表达式, 上边这部分就描述了扩展正则表达式.

POSIX字符类. [:class:]

[:alnum:]匹配字母和数字. 等价于A-Za-z0-9.
[:alpha:]匹配字母. 等价于A-Za-z.
[:blank:]匹配一个空格或是一个制表符(tab).
[:cntrl:]匹配控制字符.
[:digit:]匹配(十进制)数字. 等价于0-9.
[:graph:](可打印的图形字符). 匹配ASCII码值范围在33 - 126之间的字符. 与下面所提到的[:print:]类似, 但是不包括空格字符(空格字符的ASCII码是32).
[:lower:]匹配小写字母. 等价于a-z.
[:print:](可打印的图形字符). 匹配ASCII码值范围在32 - 126之间的字符. 与上边的[:graph:]类似, 但是包含空格.
[:space:]匹配空白字符(空格和水平制表符).
[:upper:]匹配大写字母. 等价于A-Z.
[:xdigit:]匹配16进制数字. 等价于0-9A-Fa-f.

POSIX字符类通常都要用引号或双中括号([[ ]])引起来.grep [[:digit:]] test.file

通配(globbing)

Bash本身并不会识别正则表达式. 在脚本中, 使用RE的是命令和工具 -- 比如sed和awk-- 这些工具能够解释RE. Bash仅仅做的一件事是文件名扩展。-- 这就是所谓的通配。

-- 但是这里所使用的并不是标准的RE, 而是使用通配符. 通配(globbing)解释标准通配符, *, ?, 中括号扩起来的字符, 还有其他一些特殊字符(比如^用来表示取反匹配). 然而通配(globbing)所使用的通配符有很大的局限性. 包含*的字符串不能匹配以"点"开头的文件, 比如,.bashrc. [2]另外, RE中所使用的?, 与通配(globbing)中所使用的?, 含义并不相同.

Bash只能对未用引号引用起来的命令行参数进行文件名扩展. echo命令可以印证这一点.echo *

[1] 文件名扩展意味着扩展包含有特殊字符的文件名模式或模版. 比如, example.???可能会被扩展成example.001或(和)example.txt.
[2] 文件名扩展能够匹配以"点"开头的文件, 但是, 你必须在模式字符串中明确的写上"点"(.), 才能够扩展.

原文地址:https://www.cnblogs.com/fly-xiang-zhao/p/3926571.html