06、shell正则表达式
正则表达式在某种语言中都会有,功能就是匹配符合您预期要求的字符串
shell正则表达式有两种:
基本正则表达式:BRE(基本正则表达式)
扩展正则表达式:ERE(扩展正则表达式),扩展的表达式有+,?,|和()
符号 | 描述 | 示例 |
。 | 匹配除换行符(\n)之外的任意字符 |
匹配123: echo -e " 123 \n 456" | grep -E '1.3' |
^ | 匹配前面字符串开头 |
匹配以abc开头的行: echo -e "abc \n nxyz" | grep -E "^abc" |
$ | 匹配前面字符串结尾 |
匹配以xyz结尾的行: echo -e "abd \n nxyz" | grep -E "nyz$" |
* | 匹配前一个字符零个或多个 |
匹配x,xo和xoo: echo -e "x \n xo \n xoo \n o \n oo"| grep "xo *" x是必须的,批量了o零个或多个 |
+ | 匹配前面字符1个或多个 |
匹配abc和abcc: echo -e "abc \n abcc \n add" | grep -E 'ab+' 这样是匹配一个别数字:echo “113” | grep -E -o '[0-9]' 连续匹配多个数字:echo "113" | grep -E -o '[0-9]+' |
? | 匹配前面字符0个或1个 |
匹配ac或abc: echo -e "ac \n abc \n add" | grep -E 'a?c' |
[] | 匹配中括号之中的任意一个字符 |
匹配a或c: echo -e "a \n b \n c" | grep -E '[ac]' |
[-。] | 匹配中括号中范围内的任意一个字符 |
匹配所有字母: echo -e "a \n b \n c" | grep -E '[a-z]' |
[^] | 匹配[^字符]之外的任意一个字符 |
匹配a或b: echo -e "a \n b \n c \n z" | grep -E '[^cz]' 匹配末尾数字:echo“ abc:cde; 123” | grep -E'[^;] + $' |
{n}或{n,} | 匹配花括号前面的字符至少n个字符 |
匹配abc字符串(至少三个字符以上字符串) echo -e " a \n abc \n c" | grep -E "[a-z]{3}" |
{n,m} | 匹配花括号前面的字符至少n个字符,最多m个字符 |
匹配12和123(不加便姐夫会匹配字符) echo -e "1 \n 12 \n 123 \n 1234"| grep -E -w -o '[0-9]{2,3}' |
\< | 边界符,匹配字符串开始 |
匹配开始时123和1234: echo -e "1 \n 12 \n 123 \n 1234"| grep -E -w "\<123" |
\> | 边界符,匹配字符串结束 |
匹配结束时1234: echo -e " 1 \n 12 \n 123 \n 1234" | grep -E '4\>' |
() |
单元或组合:将小括号里面作为一个组合 \n 反向引用,n时数字,从1开始编号,表示引用第n个分组匹配的内容 |
匹配123a: echo "123abc" | grep -E ([a-z0-9]{4}) 匹配出现xo零次或多次: echo -e "x \n xo \n xoo \n o \n oo" | grep -E "(xo)*" |
| |
匹配竖杠两边的任意一个 |
匹配12和123: echo -e "1 \n 12 \n 123 \n 1234" | grep -E "12|123" |
\ | 转义符,将特殊符号转成原累积 |
匹配1.2 1 \.2 否则112也会匹配到 |
Posix字符 |
描述 |
[:数字:] | 等效[a-zA-Z0-9] |
[:α:] | 等效[a-zA-Z] |
[:降低:] | 等效[az] |
[:上:] | 等效[AZ] |
[:数字:] | 等效[0-9] |
[:空间:] | 匹配任意空白字符,等效[\ t \ n \ r \ f \ v] |
[:图形:] | 非空白字符 |
[:空白:] | 空格与定位字符 |
[:cntrl:] | 控制字符 |
[:打印:] | 可显示的字符 |
[:punct:] | 标点符号字符 |
[:xdigit:] | 十六进制 |
示例:
echo -e“ 1 \ n12 \ n123 \ n1234a” | grep'[[:digit:]]'
在Shell下使用这些正则表达式处理文本最多的命令有以下几个工具:
命令 |
描述 |
grep | 默认不支持扩展表达式,加-E选项开启ERE。如果不加-E使用花括号要加转义符\ {\} |
egrep | 支持基础和扩展表达式 |
awk | 支持egrep所有的正则表达式 |
sed | 默认不支持扩展表达式,加-r选项开启ERE。如果不加-r使用花括号要加转义符\ {\} |
支持的特殊字符 |
描述 |
\ w | 匹配任意数字和字母,等效[a-zA-Z0-9_] |
\ W | 与\ w相反,等效[^ a-zA-Z0-9_] |
\ b | 匹配字符串开始或结束,等效\ <和\> |
\ s | 匹配任意的空白字符 |
\ S | 匹配非空白字符 |
空白符 |
描述 |
\ n | 换行符 |
\ r | 回车符 |
\ t | 水平制表符 |
\ v | 垂直制表符 |
\ 0 | 空值符 |
\ b | 退后一格 |