本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告
  • 首页
  • Shell
  • 【Linux Shell脚本编程】通配符与正则表达式的区别与介绍

【Linux Shell脚本编程】通配符与正则表达式的区别与介绍

发布:TangLu2018-6-26 12:00分类: Shell 标签: 通配符 正则表达式

关于什么是通配符、什么是正则表达式就不多说了,本文主要讲解两者的使用方法和区别。

什么时候使用通配符?什么时候使用正则表达式?
1、不需要思考的判断方法:grep(egrep)、awk、sed三剑客中使用的都是正则表达式

2、针对文件或目录名匹配-->通配符针对文本内容上进行匹配-->正则表达式


一、通配符常用语法:
1、*:匹配任意长度的任意字符,就是说“什么都可以”。

/etc/fs*  #/etc中以fs开头的文件将被匹配
/tmp/my*1  #/tmp中以my开头并且以1结尾的文件将被匹配


2、?与任何单个字符匹配。

myfile?  #文件名为myfile且后面跟任一单个字符的任何文件将被匹配
/tmp/notes?txt  #如果/tmp/notes.txt和/tmp/notes_txt都存在的话他们都会被匹配

3、[ ]与?相似,可以匹配一个括号内的字符,也可以用“-”进行范围指定。

myfile[12]  #将与myfile1和myfile2匹配
[Cc]hange[Ll]og  #Changelog、ChangeLog、changeLog以及changelog都可匹配,与大写形式的变形匹配时,使用括弧通配符很有用
ls /etc/[0-9]  #将列出 /etc 中以数字开头的所有文件。
ls /tmp/[A-Za-z]  #将列出/tmp中以大写字母或小写字母开头的所有文件。


4、[!]:括号内的“!”代表非的意思,即不与括弧中的字符匹配。

rm myfile[!9]  #删除除了myfile9之外的名为myfile加一个字符的所有文件


使用通配符注意事项 
由于 bash会将一些字符(?,*,等)进行特殊处理,因此输入这些字符到命令中时,把字符加上单引号
是最好的选择。


二、正则表达式:

1、基础正则表达式(默认不认识扩展正则里的元字符,除非使用转义符):

.  #匹配任意一个字符,和通配符中的?作用一样
*  #匹配*号前面的字符出现0次或任意次
^  #匹配行首,如grep "^hello" test.txt,代表匹配hello开头的行
$  #匹配行尾,如hello$,代表hello结束的行
[ ]  #匹配指定范围内的任意单个字符,如[a-z]代表从26个小写字母里任选其一 
[^]  #匹配的结果取反,如[^0-9],代表匹配的内容非数字
\{ m,n\}  #m匹配出现的次数,n代表最大次数,"\"是转义符。如果想表示至少多少次(上不封顶)可以用\{m,\},如至少5次{5,\}。至多的话需要表示为\{0,n\},精确多少次表示方法为{m\}
\<  #锚定词首,如\<root代表单词首部是root的才符合规则    
\>  #锚定词尾


2、扩展正则表达式(在基础正则上添加了更多元字符,无需转义):

()  #分组,(who|what),表示匹配who或者what,也可以做后项引用,如^(.*)$ /msie/$1,这里的$1取的是括号内的内容,在Nginx Rewrite中比较常用
?  #匹配前面的字符0次或1次,可以理解为“?”前的一个字符要么有,要么没有
+  #重复前一个字符一次或多次
|  #或

3、POSIX字符类:

[[:alnum:]]:字母与数字字符
[[:alpha:]]:字母字符,包含大小写
[[:blank:]]:空格与制表符
[[:digit:]]:数字
[[:lower:]]:小写字母
[[:upper:]]:大写字母
[[:space:]]:包括换行符、回车等在内的所有空白字符
[[:punct:]]:标点符号


4、其他元字符

# \d  匹配阿拉伯数字,等同于[0-9]。
rewrite ^/course-(\d+).html$ /course/$1/course.html break  #访问/course-11.html页面会跳转到/course/11/course.html这样的页面
# \D  匹配阿拉伯数字之外的任意字符,等同于[^0-9]。
# \x  匹配十六进制数字,等同于[0-9A-Fa-f]。
# \X  匹配十六进制数字,等同于[^0-9A-Fa-f]。
# \w  匹配单词字母,等同于[0-9A-Za-z_]。
# \W  匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。
# \t  匹配<TAB>字符。
# \s  匹配空白字符,等同于[ \t]。
# \S  匹配非空白字符,等同于[^\t]。
# \a  所有的字母字符. 等同于[a-zA-Z]
# \l  小写字母 [a-z]
# \L  非小写字母 [^a-z]
# \u  大写字母 [A-Z]
# \U  非大写字母 [^A-Z]


替换变量(后项引用) 
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用1、2等变量来访问 \( 和 \) 中的内容

%s/\(192.168.100\).10)/\1.20/    #把192.168.100.10替换为192.168.100.20
%s#\(192.168.100.\)10)#\120#    #注意写法区别
%s#\(192.\)\(168.\)\(100.\)10#\1\2\320#
3,10s/\(.*\)/#\1/    #给3-10行增加注释



三、正则表达式元字符语法示例:

[  ] :与通配符中的[  ]作用相同。

$ grep dev.hda[12] /etc/fstab
/dev/hda1       /boot           reiserfs        noauto,noatime,notail 1 2
/dev/hda2       swap            swap            sw 0 0

[^]:代表使方括号中的意思相反。在正则表达式中使用 [^],而在glob中使用 [!]:
$ grep dev.hda[^12] /etc/fstab
/dev/hda3       /               reiserfs        noatime,ro 1 1
#/dev/hda4      /mnt/extra      reiserfs        noatime,rw 1 1

*: *号前面的一个字符出现零次或者多次:
ab*c(与 abbbbc 匹配但不与 abqc 匹配,*号前面字符出现多次的情况)
ab*c(与 abc 匹配但不与 abbqbbc 匹配,*号前面字符出现一次的情况)
ab*c(与 ac 匹配但不与 cba 匹配,*号前面字符出现零次的情况)
.*(与任何字符串匹配)
foo.*(与以 foo 开始的任何字符串相匹配)

^和$:每行的开始或结尾:
grep ^# /etc/fstab  #匹配以#开始的行
grep ^$ /etc/fstab  #匹配空白行


温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《【Linux Shell脚本编程】通配符与正则表达式的区别与介绍
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-120.html  [生成短网址]

已有 0/3238 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~