Wildcards and Pattern Matching
*
:匹配任意个数的任意字符
*
可以代表任意个数的任意的连续字符:
*.txt
:匹配所有以.txt
结尾的字符串;g*
:匹配所有以g
开头的字符串;g*.txt
:匹配所有以g
开头、.txt
结尾的字符串。
1 | [zclzcl@localhost Playground]$ ls |
?
:匹配一个字符
?
可以代表任意的1个字符。需要注意的是,?
必须代表1个字符,也就是说既不能是0个,也不能多于1个:
?.txt
:匹配所有以.txt
结尾且.txt
之前只有一个字符的字符串;g?
:匹配所有以g
开头且只有两个字符的字符串;g?.txt
:匹配所有以g
开头、.txt
结尾且g
和.txt
之间只有一个字符的字符串。
1 | [zclzcl@localhost Playground]$ ls ?.txt |
[]
:匹配方框中的任意一个字符
[]
会匹配内部的任意一个且必须是一个字符,比如:
- 与
g[dg]
相匹配的只有gd
与gg
。
1 | [zclzcl@localhost Playground]$ ls |
[^]
:匹配任意不在方框中的一个字符
[^]
表明其所在位置(只占一位)的匹配结果要不包含方框内的字符,比如:
- 与
g[^dg]
相匹配的是任何第二个字符不是d
或g
的以g
开头的两字符字符串。
1 | [zclzcl@localhost Playground]$ ls |
[[start]-[end]]
:匹配[start]
和[end]
之间的任意一个字符
[[start]-[end]]
允许我们匹配任何一个在[start]
和[end]
之间的字符,其中[start]
和[end]
必须是两个存在顺序关系的字符,比如数字、字母等:
1 | [zclzcl@localhost Playground]$ ls |
上面指令会匹配所有以g
开头,且第二个字符在g
和r
之间的字符串。
以上这些涉及
[]
的匹配,[]
内的内容除了可以是用户指定的字符串外,还可以是一类字符串,如:
[:alnum:]
表任意一个字符或字母;[:alpha:]
表任意一个字母;[:digit:]
表任意一个数字;[:lower:]
表任意一个小写字母;[:upper:]
表任意一个大写字母。
g[[:lower:]]
将匹配任意数量的以g
开头、第二个字符为小写字母的两字符字符串。
\
:转义字符
有时,我们会想要匹配名字中带有通配符字符,如*
和?
的字符串,这时候就需要使用转义字符\
让通配符失去通配符意义而转为普通的字符串:
1 | [zclzcl@localhost Playground]$ ls |
上面的命令,\?
代表字符?
,因此其匹配的是所有以?
结尾的字符串。
花括号展开
花括号展开十分类似于[[start]-[end]]
形式的通配符模式匹配。通过花括号展开,我们可以从一个包含花括号的模式中创建出多个字符串,其基本使用模式为:
1 | {[stringA],[stringB],...,[string]} |
需要注意的是,花括号的内容只能用
,
分割,而不能有空白符,否则花括号会被视为一个普通的字符串。
比如,{AB,CB,CC}
将产生3个字符串AB
、CB
和CC
:
1 | [zclzcl@localhost Playground]$ rm * |
而{2..6}
将产生5个字符串2
、3
、4
、5
和6
:
1 | [zclzcl@localhost Playground]$ rm * |
注意是两个
.
。
花括号展开还可以嵌套。嵌套时,每个花括号被视为一个整体,依次展开,如:
1 | [zclzcl@localhost Playground]$ rm * |
上面的式子将一次性生成99个文件。其基本原理是:最外层花括号内的两项00{1..9}
和0{10..99}
分别单独展开。