正则表达式分类
- 基本正则表达式(BREs)
- 扩展正则表达式(EREs)
- Perl正则表达式(PREs)
字符类使用的符号
. #匹配一个字符(\n除外)
[] #匹配括号[]内的字符
- #在括号[]内表示范围
^ #在括号[]的开头表示取非 !
示例:
printf "asdfghjkl123456789\n" >> regex
grep -n -o 'a.d' regex
grep -n -o '[1-9]' regex
grep -n -o '[^1-9]' regex
单个字符(PREs支持单个字符,BREs和EREs不支持单个字符)
\w #数字字母和下划线
\W #非\w的字符
\d #数字
\D #非数字
\s #空白字符
\S #非空白字符
\r #回车
\n #换行
\f #换页
\t #制表符
\v #垂直制表符
[\b] #回退符
示例:
printf "asdfghjkl\t123456789\n" >> regex
grep -P -n -o 'f\w' regex
grep -P -n -o '3\d' regex
grep -P -n -o '.\t.' regex
单个字符(Linux Shell环境下的单个字符)
[:alnum:] #匹配一个数字或字母
[:alpha:] #字母
[:digit:] #数字
[:lower:] #小写字母
[:upper:] #大写字母
[:space:] #空白字符
[:blank:] #制表符
[:print:] #可打印字符
[:cntrl:] #控制字符
[:xdigit:] #十六进制数
[:punct:] #标点符号
[:graph:] #可见可打印字符
数量限定符
{N} #紧跟在它前面的单元精确匹配 N 次
{N,} #最少匹配 N 次
{,M} #最多匹配 M 次
{N, M} #匹配 N-M 次之间
* #{0,}
+ #{1,}
? #{0,1}
推荐使用*, +, ?;默认下*, +, ?是贪婪模式; *?, +?, ??则是非贪婪模式
示例:
printf "192.168.14.1 \n192.158.a.14\n" >> regex
grep -P -n -o '\d{1,3}\.\d+?\.' regex
位置限定符
^ #行首位置
$ #行尾位置
\b #单词开头或结尾位置
\B #单词中间位置
示例:
printf "cherrying\trysx\t1234\nabcd1234\n" >> regex
grep -P -n -o '^\bch' regex
grep -P -n -o '34\b' regex
其他特殊字符
\ #转义字符
() #括起来的部分组成一个单元
| #连接两个子表达式,或的关系
在BREs中 (){}|+? 表示本义,要使用特殊义要转义
而在EREs和PREs中 (){}|+? 直接表示特殊义
后置引用(BREs不支持后置引用)
\0 #引用所有匹配的内容
\1 #引用括号()括起来的第一个单元
...
\9 #引用括号()括起来的第九个单元
示例:
printf "192.168.103.1:8080\n127.0.0.1:8080\n111.222.333.1:8080\n" >> regex
sed -E s/'(([0-9]|[0-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9][0-9]|[01][0-9][0-9]|2[0-4][0-9]|25[0-5])'/\\2/g regex