0%

Linux Shell通配符模式表达式

一、语法

1.1、通配符

“*”:匹配任意字符串,包括空字符串,不包含对“/”字符的匹配。
“?”:匹配任意单个字符,不能匹配“/”字符。

1.2、字符类

“[abc]”:匹配“a”或者“b”或者“c”字符。
“[!abc]”:匹配除了“a,b,c”这3个字符之外的任意一个字符。

备注:
字符类内不包含对“/”字符的匹配。

1.3、字符范围

“[a-z]”:匹配26个英文小写字符中任意一个。
“[!a-z]”:匹配除了“26个英文小写字符”之外的任意一个字符。

备注:
字符范围内不包含对“/”字符的匹配。

二、实验

当前目录结构如下:

1
2
3
4
5
├── 10.txt
├── 1.txt
├── aa.txt
├── a.txt
├── c

2.1、实验1

执行ls *.txt命令,得到:

1
10.txt  1.txt  aa.txt  a.txt

2.2、实验2

执行ls ?.txt命令,得到:

1
1.txt  a.txt

2.3、实验3

执行ls [0-9].txt命令,得到:

1
1.txt

2.4、实验4

执行ls [012].txt命令,得到:

1
1.txt

2.5、实验5

执行ls [!0-9].txt命令,得到:

1
a.txt

2.6、实验6

执行ls [!789]?.txt命令,得到:

1
10.txt  aa.txt

三、其他

3.1、“locale”设置影响

“字符范围”所能匹配的字符跟“locale”设置息息相关。比如在有些“locale”设置中,“[a-d]”等价于“abcd”,而在有些“locale”设置中,“[a-d]”等价于“[aBbCcDd]”。

3.2、一个匹配特殊点

想要使用“Linux Shell通配符模式表达式”匹配以“.”开头的文件,对于该开头“.”字符:必须显式指定“.”字符进行匹配,尝试使用“通配符”,“字符类”,“字符范围”匹配该开头“.”字符会失败。
比如在当前目录下有一个“.a.txt”文件,使用如下类似命令都不能打印该文件:

1
2
3
ls *
ls [.]*
ls [.-9]*

只有使用如下类似命令才能打印该文件:

1
2
3
ls .*
ls .[a]*
ls .[a-z]*

参考文献: [1]man 7 glob [2]man 3 glob [3]man sh [4]man bash [5]http://stackoverflow.com/questions/43862113/what-is-returned-after-pathname-expansion-in-shell?noredirect=1#comment74803794_43862113
您的支持将鼓励我继续分享!