linux通配符和正则表达式的区别总结

目录

通配符和正则表达式的区别

Linux中的通配符


通配符和正则表达式的区别

在看鸟哥的Linux私房菜的时候看到十二章一直强调通配符和正则表达式的区别,在我的理解中,两者貌似是一样的都是用来匹配的。Google之网上给出的答案是:

在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的

而通配符多用在文件名上,比如查找find,ls,cp,等等

下表是鸟哥给的Linux下的通配符

符號內容
*萬用字元,代表 0 個或多個字元(或數字)
?萬用字元,代表『一定有』一個字母
#註解,這個最常被使用在 script 當中,視為說明!
/跳脫符號,將『特殊字元或萬用字元』還原成一般字元
|分隔兩個管線命令的界定;
;連續性命令的界定(注意!與管線命令並不相同)
~使用者的家目錄
$亦即是變數之前需要加的變數取代值
&將指令變成背景下工作
!邏輯運算意義上的『非』 not 的意思!
/路徑分隔的符號
>, >>輸出導向,分別是『取代』與『累加』
'單引號,不具有變數置換的功能
"具有變數置換的功能!
` `兩個『 ` 』中間為可以先執行的指令!
( )在中間為子 shell 的起始與結束
[ ]在中間為字元的組合
{ }在中間為命令區塊的組合!

 

下表是鸟哥总结的正则表达式的字符

RE 字符意義與範例
^word待搜尋的字串(word)在行首!
範例:grep -n '^#' regular_express.txt
搜尋行首為 # 開始的那一行!
word$待搜尋的字串(word)在行尾!
範例:grep -n '!$' regular_express.txt
將行尾為 ! 的那一行列印出來!
.代表『任意一個』字符,一定是一個任意字符!
範例:grep -n 'e.e' regular_express.txt
搜尋的字串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e 中間『一定』僅有一個字元,而空白字元也是字元!
/跳脫字符,將特殊符號的特殊意義去除!
範例:grep -n /' regular_express.txt
搜尋含有單引號 ' 的那一行!
*重複零個或多個的前一個 RE 字符
範例:grep -n 'ess*' regular_express.txt
找出含有 (es) (ess) (esss) 等等的字串,注意,因為 * 可以是 0 個,所以 es 也是符合帶搜尋字串。另外,因為 * 為重複『前一個 RE 字符』的符號, 因此,在 * 之前必須要緊接著一個 RE 字符喔!例如任意字元則為 『.*』 !
/{n,m/}連續 n 到 m 個的『前一個 RE 字符』
若為 /{n/} 則是連續 n 個的前一個 RE 字符,
若是 /{n,/} 則是連續 n 個以上的前一個 RE 字符!
範例:grep -n 'go/{2,3/}g' regular_express.txt
在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog)
[]字元集合的 RE 特殊字符的符號
[list]
範例:grep -n 'g[ld]' regular_express.txt
搜尋含有 (gl) 或 (gd) 的那一行~
需要特別留意的是,在 [] 當中『謹代表一個待搜尋的字元』,
例如: a[afl]y 代表搜尋的字串可以是 aay, afy, aly 
亦即 [afl] 代表 a 或 f 或 l 的意思!

[ch1-ch2]
範例:grep -n '[0-9]' regular_express.txt
搜尋含有任意數字的那一行!需特別留意,在字元集合 [] 中的減號 - 是有特殊意義的,他代表兩個字元之間的所有連續字元!但這個連續與否與 ASCII 編碼有關, 因此,您的編碼需要設定正確(在 bash 當中,需要確定 LANG 與 LANGUAGE 的變數是否正確!) 例如所有大寫字元則為 [A-Z]

[^]
範例:grep -n 'oo[^t]' regular_express.txt
搜尋的字串可以是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 [] 內時, 代表的意義是『反向選擇』的意思~例如,我不要大寫字元,則為 [^A-Z] ~ 但是,需要特別注意的是,如果以 grep -n [^A-Z] regular_express.txt 來搜尋, 卻發現該檔案內的所有行都被列出,為什麼?因為這個 [^A-Z] 是『非大寫字元』的意思, 因為每一行均有非大寫字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小寫字元, 以及雙引號 (") 等字元,所以當然符合 [^A-Z] 的搜尋!

 

基本上解释就是通配符是系统命令使用,一般用来匹配文件名或者什么的用在系统命令中。而正则表达式是操作字符串,以行尾单位来匹配字符串使用的。

还有一点需要注意的是:*在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表达式中他是重复之前的一个或者多个字符,不能独立使用的。比如通配符可以用*来匹配任意字符,而正则表达式不行,他只匹配任意长度的前面的字符。

 

Linux中的通配符

通配符是由shell处理的, 它只会出现在 命令的“参数”里。当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

SHELL中的通配符

帮助手册:# man 7 glob 

*

匹配任意长度的任意字符,可以是0个

?

匹配任意单个字符,必须是1个

[ ]

匹配指定字符范围内的任意单个字符

[a-z,A-Z,0-9]

匹配所有数字字母,可以不加逗号

[a-z]

表示a-z,A-Y,表示a,A,b,B.....a。不包含Z

[A-Z]

表示A,b,B.....z,Z。不包含a

[a-Z]

表示所有大小写字母

[:upper:]

所有大写字母

[:lower:]

所有小写字母

[:alpha:]

所有字母,大小写

[:digit:]

所有数字

[:alnum:]

所有数字+字母

[:blank:]

水平空白字符

[:space:]

水平或垂直空白字符

[:punct:]

标点符号

[:print:]

可打印字符

[:cntrl:]

控制(非打印)字符

[:graph:]

图形字符

[:xdigit:]

十六进制字符

[^]

匹配指定字符范围外的任意单个字符

[^0-9]

相当于[^[:digit:]]

[^a-z]

表示Z + 其他

[^A-Z]

表示a + 其他

 

 示例:

1、显示/etc目录下,所有以.d结尾的文件或目录

# ls -d /etc/*.d
/etc/bash_completion.d  /etc/modprobe.d      /etc/rc6.d
/etc/binfmt.d           /etc/modules-load.d  /etc/rc.d
/etc/chkconfig.d        /etc/my.cnf.d        /etc/request-key.d
/etc/cron.d             /etc/pam.d           /etc/rsyslog.d
/etc/depmod.d           /etc/popt.d          /etc/rwtab.d
/etc/dracut.conf.d      /etc/prelink.conf.d  /etc/setuptool.d
/etc/exports.d          /etc/profile.d       /etc/statetab.d
/etc/gdbinit.d          /etc/rc0.d           /etc/sudoers.d
/etc/grub.d             /etc/rc1.d           /etc/sysctl.d
/etc/init.d             /etc/rc2.d           /etc/tmpfiles.d
/etc/krb5.conf.d        /etc/rc3.d           /etc/xinetd.d
/etc/ld.so.conf.d       /etc/rc4.d           /etc/yum.repos.d
/etc/logrotate.d        /etc/rc5.d

2、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录

#ls -d /etc/[mnrp]*.conf
/etc/man_db.conf  /etc/nfsmount.conf     /etc/resolv.conf
/etc/mke2fs.conf  /etc/nsswitch.conf     /etc/rsyncd.conf
/etc/nfs.conf     /etc/request-key.conf  /etc/rsyslog.conf

 

参考文章:

https://blog.csdn.net/huiguixian/article/details/6284834

https://www.cnblogs.com/ysuwangqiang/p/11364173.html

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕城南风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值