Wildcards and Pattern Matching

*:匹配任意个数的任意字符

*可以代表任意个数的任意的连续字符:

  • *.txt:匹配所有以.txt结尾的字符串;
  • g*:匹配所有以g开头的字符串;
  • g*.txt:匹配所有以g开头、.txt结尾的字符串。
1
2
3
4
5
6
7
8
[zclzcl@localhost Playground]$ ls
file1.txt file2.txt gd gg ground ground.txt g.txt
[zclzcl@localhost Playground]$ ls *.txt
file1.txt file2.txt ground.txt g.txt
[zclzcl@localhost Playground]$ ls g*
gd gg ground ground.txt g.txt
[zclzcl@localhost Playground]$ ls g*.txt
ground.txt g.txt

?:匹配一个字符

?可以代表任意的1个字符。需要注意的是,?必须代表1个字符,也就是说既不能是0个,也不能多于1个:

  • ?.txt:匹配所有以.txt结尾且.txt之前只有一个字符的字符串;
  • g?:匹配所有以g开头且只有两个字符的字符串;
  • g?.txt:匹配所有以g开头、.txt结尾且g.txt之间只有一个字符的字符串。
1
2
3
4
5
6
[zclzcl@localhost Playground]$ ls ?.txt
g.txt
[zclzcl@localhost Playground]$ ls g?
gd gg
[zclzcl@localhost Playground]$ ls g?.txt
ls: cannot access g?.txt: No such file or directory

[]:匹配方框中的任意一个字符

[]会匹配内部的任意一个且必须是一个字符,比如:

  • g[dg]相匹配的只有gdgg
1
2
3
4
5
6
[zclzcl@localhost Playground]$ ls
file1.txt file2.txt gd gg ground ground.txt g.txt
[zclzcl@localhost Playground]$ ls g[dg]
gd gg
[zclzcl@localhost Playground]$ ls g[rd]*
gd ground ground.txt

[^]:匹配任意不在方框中的一个字符

[^]表明其所在位置(只占一位)的匹配结果要不包含方框内的字符,比如:

  • g[^dg]相匹配的是任何第二个字符不是dg的以g开头的两字符字符串。
1
2
3
4
[zclzcl@localhost Playground]$ ls
file1.txt file2.txt gd gg ground ground.txt g.txt
[zclzcl@localhost Playground]$ ls g[^dg]*
ground ground.txt g.txt

[[start]-[end]]:匹配[start][end]之间的任意一个字符

[[start]-[end]]允许我们匹配任何一个在[start][end]之间的字符,其中[start][end]必须是两个存在顺序关系的字符,比如数字、字母等:

1
2
3
4
[zclzcl@localhost Playground]$ ls
file1.txt file2.txt gd gg ground ground.txt g.txt
[zclzcl@localhost Playground]$ ls g[g-r]*
gg ground ground.txt

上面指令会匹配所有以g开头,且第二个字符在gr之间的字符串。

以上这些涉及[]的匹配,[]内的内容除了可以是用户指定的字符串外,还可以是一类字符串,如:

  • [:alnum:]表任意一个字符或字母;
  • [:alpha:]表任意一个字母;
  • [:digit:]表任意一个数字;
  • [:lower:]表任意一个小写字母;
  • [:upper:]表任意一个大写字母。

g[[:lower:]]将匹配任意数量的以g开头、第二个字符为小写字母的两字符字符串。

\:转义字符

有时,我们会想要匹配名字中带有通配符字符,如*?的字符串,这时候就需要使用转义字符\让通配符失去通配符意义而转为普通的字符串:

1
2
3
4
[zclzcl@localhost Playground]$ ls
chap? file1.txt file2.txt gd gg ground ground.txt g.txt what?
[zclzcl@localhost Playground]$ ls *\?
chap? what?

上面的命令,\?代表字符?,因此其匹配的是所有以?结尾的字符串。

花括号展开

花括号展开十分类似于[[start]-[end]]形式的通配符模式匹配。通过花括号展开,我们可以从一个包含花括号的模式中创建出多个字符串,其基本使用模式为:

1
2
3
{[stringA],[stringB],...,[string]}

{[start]..[end]}

需要注意的是,花括号的内容只能用,分割,而不能有空白符,否则花括号会被视为一个普通的字符串。

比如,{AB,CB,CC}将产生3个字符串ABCBCC

1
2
3
4
[zclzcl@localhost Playground]$ rm *
[zclzcl@localhost Playground]$ touch {AB,CB,CC}
[zclzcl@localhost Playground]$ ls
AB CB CC

{2..6}将产生5个字符串23456

1
2
3
4
[zclzcl@localhost Playground]$ rm *
[zclzcl@localhost Playground]$ touch {2..6}
[zclzcl@localhost Playground]$ ls
2 3 4 5 6

注意是两个.

花括号展开还可以嵌套。嵌套时,每个花括号被视为一个整体,依次展开,如:

1
2
3
4
5
6
7
8
9
[zclzcl@localhost Playground]$ rm *
[zclzcl@localhost Playground]$ touch {00{1..9},0{10..99}}
[zclzcl@localhost Playground]$ ls
001 007 013 019 025 031 037 043 049 055 061 067 073 079 085 091 097
002 008 014 020 026 032 038 044 050 056 062 068 074 080 086 092 098
003 009 015 021 027 033 039 045 051 057 063 069 075 081 087 093 099
004 010 016 022 028 034 040 046 052 058 064 070 076 082 088 094
005 011 017 023 029 035 041 047 053 059 065 071 077 083 089 095
006 012 018 024 030 036 042 048 054 060 066 072 078 084 090 096

上面的式子将一次性生成99个文件。其基本原理是:最外层花括号内的两项00{1..9}0{10..99}分别单独展开。

参考