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}分别单独展开。