正则表达式是一种处理字符串的方法,是一组具有一定性质的字符串的描述,我自己认为正则表达式就是字符串的模板。
在Linux中,正则表达式以行为单位进行字符串的进行处理,通过一些特殊字符串的辅助,可以让用户轻易达到查找、删除和替换某指定字符串的处理程序。
按照严谨程度,可以分为基础正则表达式和扩展正则表达式。我们一般使用的是基础正则表达式,不过为了更简单地完成复杂的字符串处理动作,就要使用扩展正则表达式。
基础正则表达式:
特殊符号 | 代表意义 | [:alnum:] | 英文大小写字符及数字 0-9 A-Z a-z | [:alpha:] | 英文字符 A-Z a-z | [:digit:] | 数字 0-9 | [:lower:] | 小写英文字符 a-z | [:upper:] | 大写英文字符 A-Z | [:blank:] | 空格、Tab | [:punct:] | 标点符号 " ' ? ! ; : # $ | [:space:] | 任何会产生空白的字符,空格、Tab、CR | [:print:] | 任空格符(空格键和Tab)外的其他所有按键 | [:xdigit:] | 十六进制数字类型 0-9 A-F a-f | [:cntrl:] | 键盘上面的控制按键 CR LF TAB DEL | ^ | 一行的开头 | $ | 一行的结束 | * | 前一个字符出现0次会多次 | . | 任意字符 | [list] | 表示其中一个 有且仅有一个 括号内的元素为or的关系 例如[abcd]为abcd中的一个 | \ | 转义字符 例如在正则表达式中.代表任意字符,若果要找出含有点的行该怎么办? \. | [n1-n2] | 字符范围 强调的是范围 根据编码方式,位置在n1和n2的字符中的一个。 [A-Z] | [^list] | 反向选择 例如 不包含abc的一行 [^abc] | {n,m} [n], {n,} | 对前面字符(组)的次数范围的限定 a{2,5} a出现2-5次, a{2} a出现2次, a{2,} a出现2次或2次以上 | | |
扩展正则表达式
特殊符号 | 代表意义 | + | 前面的一个字符出现一次或多次 一次以上 | ? | 前面的字符出现0次或一次 | | | 或(or) abc|bcd | () | 组字符串 glad或good g(la|oo) | ()+ | 括号中的字符串出现一次或多次 例 A(xyz)+C 可匹配的字符串有AxyzC AxyzxyzC等 |
注:
- 在正则表达式中 ! 不是特殊符号,并不表非!的意思。
- ( ) 是对字符串来说,而 [ ] 是对单个字符来说,例如找出A和C之间含有abcd任一字符的行,则正则表达式可表示为A[abcd]C。而找出A和C之间含有abcd或efgh这两种字符串时,正则表达式为A(abcd|efgh)
- 使用 [ ] 表示的当然也能够使用()和|表示,只是 | 的每一个元素是一个字符,而不是一个字符串。
- | 可以表示两个字符串的或,例如找出含有glad或me的行,正则表达式为glad|me
- 正则表达式与shell下的通配附是两码事,正则表达式有自己的特殊符号,shell的通配符也有自己的特殊符号,有时两者含有相同的特殊符号但是意思却不一样,例如在shell的通配符中*表示任意多个任意字符,而在正则表达式中*表示前面的字符出现0次或多次。有时,在两者中意思一样,但使用的特殊符号不同,例如,在shell中使用?表示必须存在的任意字符,但在正则表达式中 . 表示任意字符。当然也有使用相同符号表示相同含义的,例如\表示转义字符。
下面给出shell环境中的特殊字符和它们的含义,以作区分。
特殊符号 | 代表意义 | # | 批注符号,常用在shell script中 | \ | 转义字符 | : | 连续执行命令的分隔符(与管道分隔符不同) | ~ | 用户的主文件夹 | $ | 使用变量前导符,用来表示一个变量 | & | 作业控制,将命令变成背景下工作 | ! | 逻辑非 | / | 路径分隔符 | >,>> | 数据流重定向,输出导向 | <,<< | 数据流重定向,输入导向 | ‘ ’ | 单引号,不具有变量置换的功能 | “ ” | 双引号,具有变量置换的功能 | ` ` | 反单引号,可以先执行的命令,也可使用$() | ( ) | 中间为子shell的起始与结束 | { } | 中间为命令块的组合 | 通配符 | 代表意义 | * | 0到无穷多个任意字符 | ? | 有且仅有一个任意字符 | [ ] | 有且仅有一个括号内的字符 | [-] | 有且仅有一个在编码顺序内的所有字符 | [^] | 反向选择,^表示非得意思 |
|