正则表达式的学习
一、正则表达式使用场景:
# linux: vim grep sed awk
# 作用;用于匹配文本字符串中符合正则的字符,其实就是过滤文本字符串
实例:
匹配数字: ^[0-9]+$ 匹配数字1个或多个
匹配Mail: [a-z0-9A-Z_]+@[a-zA-Z0-9]+\.[a-z]+
匹配IP: ([0-9]{1,3}\.){3}[0-9]{1,3}
二、shell的通配符与正则的元字符的关系
# 首先搞清楚:
1、shell本身是不支持正则的,只是有些文本筛选工具里支持用正则里的元字符来匹配文本字符串,如grep sed awk vim/vi
2、正则里的元字符是包含shell中的通配符的
#使用区别:
shell通配符用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等
正则元字符适用于建立匹配规则的,用于筛选文本数据的
#shell中有哪些常用的通配符、特殊字符及其含义;
在shell中,匹配[]里面的字符时,是不区分大小写的,但是正则里严格区分大小写
shell中常用的通配符 | 含义 | 实例 |
---|---|---|
* | 匹配0或多个字符! | a*b表示要么ab,要么axxxxxb,跟正则不一样,不是b、ab、 aab、 aaaab,不需要为*前面字符服务 |
? | 匹配1个也必须1个任意字符! | a?b,可以是aab abb axb |
[123] | 匹配列表中任意1个字符 | |
[!]或[^123] | 匹配除列表中任意1个字符 | |
[a-b] | 匹配列表a到b中任意1个字符字符 | |
[!a-b]或[^a-b] | 匹配不在a到b间任意1个字符 | |
{a,b,...} | 匹配a或b或列表中任意1个字符 |
#shell中的常用特殊字符
特殊字符 | 含义 | 实例 |
---|---|---|
= | 定义赋值变量 | 定义a="asd" 调用$a 或${a} |
$ | 变量的调用 | 同上 |
> | 数据流重定向 | file1 > file2 或 命令 > file !就是把结果导入 |
< | 数据流重定向 | 同上,只是导入方向相反 |
| | 接受命令结果的管道符号 | ls | grep ' a*b' ! 把ls命令结果给到后面命令作筛选 |
& | 不太清楚 | |
() | 可以作数组$(1 2 3),也可以作运算、命令的替换 | 1. a=$(命令)等同a=`命令` 把命令结果赋值给a;2. 定义数组data=(n1 n2 n3),调用数组元素${data[index]} |
{} | 调用变量时作为界定变量名的边界, | 1、ab_c="hello" ,千万别这样ab-c=“hello world”,被坑过!变量名之间不能用 - ,2、调用${ab_c},${ab_c:1:3}从下标(o开始算)1取3个,${ab_c:1}=${ab_c:1:4} 不写步长默认取后面所有 3、${ab_c/l/a} 把第一个l换成a 或${ab_c//l/a} 把所有l换成a 4、${ab_c#*l} 结果为lo 或 ${ab_c##*l} 结果为 o 5、${ab_c%l* } 结果为 hel 或 ${ab_c%%l*} 结果为 he |
; | 承接上一个命令,类似于| | 我的理解等同| |
|| | 或运算符 | { |
&& | 与运算符 | [[ 表达式1 ]] && [[ 表达式2 ]]; echo $? , 要两个表达式成立为真就结果为真 |
! | 非运算 | [[ !- z '']] = [[ -n '' ]] |
# | 脚本注释 | #!/bin/bash |
\ | 字符转义:把通配符、元字符去特殊其含义,就显示本来样子 |
正则的元字符
元字符 | 含义 |
---|---|
* | 匹配前面那个字符0次或多次,就是前面那个字符可有可无 |
. | 匹配任意一个字符(除换行回车外), 等同于shell里面的? |
? | 匹配前面字符0个或1个 |
^ | 匹配是否以后面的字符或字符组为开头 |
[1] | 匹配以[]里面开通的任意一个字符开头的 |
[^] | 匹配除[]里面的字符外所有任意单个字符 |
[] | 匹配以除[]里面字符外所有任意单个字符 |
$ | 匹配是否以前面的字符或字符组为为结尾 |
[] | 匹配[]里面的任意一个字符集 |
\ | 转义或屏蔽一个元字符的特殊意义 |
[a-b] | 匹配任意一个在a到b范围内的字符 |
+ | 匹配前面字符1个或多个个 |
() | 就是把1个或多个字符捆在一起当成1个字符 |
| | 就是或的意思a |
\<a | 匹配词首以a开头的单词 |
a\> | 匹配词尾以a位结尾的单词 |
\<ab\> | 只匹配ab这个字符整体 |
\(1.2.3.\)4 | 把1.2.3.作为一个整体字符!如我想把1.2.3.4换成1.2.3.5, 则/\(1.2.3.\)4/ \15/ |
x\{n\} | 匹配x重复出现n次 |
x\{n,\} | 匹配x重复出现n次以上 |
x\{n,m\} | 匹配x出现n到m次 |
正则元字符总结:
1、 * ? + {} 都是为了服务于前面那个字符而生的,不能独立存在!如果前面字符是(),那就是服务于字符组()里面字符
2、\w等同[a-zA-Z0-9]
\W等同[^a-zA-Z0-9]