区分通配符与正则表达式:
- 正则表达式仅支持三剑客+vi,(sed、awk、grep、vi),其他命令无法使用。
- 文件名--通配符,文件内容--正则表达式。
通配符:大部分命令都支持(ls、find、cp、mv、mkdir等),用于查找文件或目录。
正则表达式:是用来匹配字符串的,针对文本内容过滤处理。
通配符:
通配符只有4种:*、?、[]、{}
* 0或多个任意字符,
? 1个任意字符,
[ ] 任一、范围内的任意1个字符
[0-9] 任意1个数字
[a-z,A-Z,0-9] 任意字母或数字(逗号可省略)
[a-z] 任意小写字母
[A-Z] 任意大写字母
[a-Z] 任意大写或小写字母
[^] 除范围内任意单个字符
[^0-9] 除数字任意单个字符
[^a-z] 除小写字母外任意单个字符
[^A-Z] 除大写字母外任意单个字符
[^a-zA-Z0-9]
{} 展开
a{b,c,d}z abz acz adz
[[:upper:]] 任意大写字母 [[:lower:]] 任意小写字母
[[:alpha:]] 任意大小写字母 [[:digit:]] 任意数字
[[:alnum:]] 任意字母或数字 [[:blank:]] 水平空白字符
[[:space:]] 水平或垂直空白字符 [[:punct:]] 标点符号
[[:print:]] 可打印字符 [[:cntrl:]] 控制(非打印)字符
[[:graph:]] 图形字符 [[:xdigit:]] 十六进制字符
特殊字符:$、|、<、>、&、{}、()、#、!、等 转义字符:\
正则表达式:
BRE:只有^、$、.、[]、*
ERE:在BRE基础上增加了+、?、|、()、{}等字符
基本正则表达式BRE
Vi、grep都是基础正则表达式
. : 任意单个字符(除换行符) grep -n “g..d” 1.sh
* : 前一个字符出现0次或连续多次 grep -n “oo*” 1.sh 匹配至少1个o
.* : 任意字符
^ : 以xx字符开头
$ : 以xx字符结尾
^$ : 空行
^.* : 以任意字符开头
.*$ : 以任意字符结尾
[] : 范围内任意1个字符,如[abc],[a-z]
[^a-z]: 除范围内的任意1个字符
^[^#] 非#开头的
扩展正则表达式ERE
grep -E、sed -r、awk都用扩展正则表达式。
扩展正则增加了+、?、|、()、{}
+ : 前一个字符出现1次或多次,相当于BRE的\+
[:/]+ 冒号或/1次或多次
? : 前一个字符出现0次或1次,相当于BRE的\?
go?d gd god
| : 或,同时过滤多个字符串
g(oo|la)d good glad
( ) : 分组过滤匹配,相当于BRE的\(\),()内条件整体向后引用。如\1,代表()中匹配到的字符love
{}: 重复匹配前1个字符次数,与BRE的\{n,m\}功能相同
a{n,m} : 匹配a至少n次,最多m次。
a{n,}: 匹配a至少n次
a{n}: 匹配a正好n次
a{,m}: 匹配n最多m次
3、转义字符
\ : 转义字符,BRE只有^、$、.、[]、*,其他都认为是普通字符。
ERE只有^、$、.、[]、*、+、?、()、{}、|、其他都认为是普通字符。
特殊字符转译为普通字符
\$、\^、
普通字符转译为元字符
\(..\)、\{\}、\<、\>、\|、
\w :字母数字下划线 \W :除字母数字下划线
\d :一个数字 \D :一个非数字。相当于[^0-9]
\n :一个换行符 \r :一个回车符
\t :一个tab符
\s :任何空白字符,空格,tab,换页符等 \S :非空白字符
\+ : 1个或多个前一个字符,相当于ERE的+
\? : 0个或1个前一个字符,相当于ERE的?
\| :或,相当于ERE的|
x\{n,m\} : 区间表达式,前面单个字符重现的次数。\{n\}重现n次;\{n,m\}重现n至m次;\{n,\}至少重现n次
\(...\) : 分组过滤匹配,()内当作一个整体向后引用,如\(ab\).*\1cd , \1 \2代表()内的内容,最多\9
\<:左闭合,其后面的字符必须作为单词的首部出现
\>:右闭合,其前面的字符必须作为单词的尾部出现
grep “root\>” 1.sh结果:xxroot、 grep “\<root” 1.sh 结果rootxxx
grep “\<root\>” 1.sh 结果:root
grep '^love' 1.txt #过滤以love开头的行
grep 'love$' 1.txt #过滤以love结尾的行
grep 'l..e' 1.txt #过滤l开头+任意2个字符+e结尾的行
grep ‘oo*’ 1.txt #过滤o+0个或多个o的行
grep ' *love' 1.txt #过滤0个多个空格+love的行
grep '[Ll]ove' 1.txt #过滤love或Love的行
grep '[A-Z]ove' 1.txt #过滤大写字母+ove的行
grep '[^A-Z]' 1.txt #过滤非大写字母的行
grep '^$' 1.txt #空行
grep '.*' 1.txt #任意字符
grep 'o\{2,4\}' 1.txt #o重复2-4次
grep -E "go+d" 1.txt #g接1次或多次0接d
grep -E "gd|good" 1.txt #gd或good
grep -E "g(la|oo)d" 1.txt #glad或good
grep -E "g(la|oo)d|g(rr|ee)d" 1.txt #glad、good、grrd、geed