20.4. 通配符

通配符在 GNU/Linux 系统和各种其他用途中非常有用。命令可以使用通配符一次对多个文件执行操作,或在文本文件中查找短语的一部分。通配符有很多用途,主要有两种不同的通配符使用方式:globbing 模式/标准通配符,它们通常被 shell 使用。另一种是正则表达式,在许多其他命令中很流行,并且常用于文本搜索和操作。

Tip提示
 

如果您的文件包含通配符表达式,那么您可以使用单引号来阻止 bash 扩展它们,或者使用反斜杠(转义字符),或者两者都使用。

例如,如果您想创建一个名为 'fo*'(fo 和星号)的文件,您必须这样做(请注意,您不应该创建名称像这样的文件,这只是一个例子)

  touch 'fo*' 
  

请注意,关于通配符的两个小节的部分内容(至少部分地)基于 grep 手册和 info 页面。请参阅参考书目以获取更多信息。

20.4.1. 标准通配符 (globbing 模式)

标准通配符(也称为 globbing 模式)被各种命令行实用程序用于处理多个文件。有关标准通配符(globbing 模式)的更多信息,请键入以下命令参考手册页

man 7 glob

Note可用于
 

标准通配符几乎可以被任何命令使用(包括 mv、cp、rm 和许多其他命令)。

? (问号)

这可以代表任何单个字符。如果您在命令行中指定了类似 "hd?" 的内容,GNU/Linux 将查找 hda、hdb、hdc 以及 a-z、0-9 之间的每个其他字母/数字。

* (星号)

这可以代表任意数量的字符(包括零,换句话说,零个或多个字符)。如果您指定了 "cd*",它将使用 "cda"、"cdrom"、"cdrecord" 以及任何以 “cd” 开头的内容,也包括 “cd” 本身。"m*l" 可以是 mill、mull、ml 以及任何以 m 开头并以 l 结尾的内容。

[ ] (方括号)

指定一个范围。如果您执行 m[a,o,u]m,它可以变成:mam、mum、mom;如果您执行 m[a-d]m,它可以变成任何以 m 开头和结尾,并且在两者之间包含字符 a 到 d 的内容。例如,以下这些都有效:mam、mbm、mcm、mdm。这种通配符指定了一种 “或” 关系(您只需要匹配其中一个)。

{ } (花括号)

术语用逗号分隔,每个术语必须是某个名称或通配符。此通配符将复制任何匹配通配符或确切名称的内容(“或” 关系,两者之一)。

例如,以下用法是有效的

cp {*.doc,*.pdf} ~

这将复制任何以 .doc 或 .pdf 结尾的文件到用户的主目录。请注意,逗号后(或任何其他地方)不允许有空格。

[!]

此构造类似于 [ ] 构造,但它不是匹配括号内的任何字符,而是匹配任何字符,只要它未在 [ 和 ] 之间列出即可。这是一个逻辑非。例如,rm myfile[!9] 将删除所有 myfiles*(即 myfiles1、myfiles2 等),但不会删除名称中任何位置包含数字 9 的文件。

\ (反斜杠)

用作“转义”字符,即保护后续的特殊字符。因此,"\\" 搜索反斜杠。请注意,您可能需要使用引号和反斜杠。

20.4.2. 正则表达式

正则表达式是一种 globbing 模式,用于处理文本。它们用于任何形式的文本多部分操作,以及用于处理文本的各种编程语言。有关正则表达式的更多信息,请参阅手册页或尝试在线教程,例如 IBM Developerworks 使用正则表达式。对于手册页,键入

键入

man 7 regex

Note正则表达式可用于
 

正则表达式被 grep 使用(并且可以被 find 和许多其他程序使用)。

Tip提示
 

如果您的正则表达式似乎不起作用,那么您可能需要在句子上使用单引号,然后在每个特殊字符上使用反斜杠。

. (点号)

将匹配任何单个字符,等同于标准通配符表达式中的 ?(问号)。因此,"m.a" 匹配 "mpa" 和 "mea",但不匹配 "ma" 或 "mppa"。

\ (反斜杠)

用作“转义”字符,即保护后续的特殊字符。因此,"\\" 搜索反斜杠。请注意,您可能需要使用引号和反斜杠。

.* (点号和星号)

用于匹配任何字符串,等同于标准通配符中的 *。

* (星号)

前面的项将被匹配零次或多次。即 n* 将匹配 n、nn、nnnn、nnnnnnn,但不匹配 na 或任何其他字符。

^ (插入符号)

表示“行的开头”。因此,"^a" 表示查找以 "a" 开头的行。

$ (美元符号)

表示“行的结尾”。因此,"a$" 表示查找以 "a" 结尾的行。

例如,此命令在文件 myfile 中搜索以 "s" 开头并以 "n" 结尾的行,并将它们打印到标准输出(屏幕)

cat myfile | grep '^s.*n$'
[ ] (方括号)

指定一个范围。如果您执行 m[a,o,u]m,它可以变成:mam、mum、mom;如果您执行 m[a-d]m,它可以变成任何以 m 开头和结尾,并且在两者之间包含字符 a 到 d 的内容。例如,以下这些都有效:mam、mbm、mcm、mdm。这种通配符指定了一种 “或” 关系(您只需要匹配其中一个)。

|

此通配符在通配符之间建立逻辑 OR 关系。这样,您可以搜索某物或某物(可能使用两个不同的正则表达式)。您可能需要在该命令之前添加 '\'(反斜杠)才能使其工作,因为 shell 可能会尝试将其解释为管道。

[^]

这等同于标准通配符中的 [!]。这执行逻辑 “非”。这将匹配任何未在方括号中列出的内容。例如,rm myfile[^9] 将删除所有 myfiles*(即 myfiles1、myfiles2 等),但不会删除名称中任何位置包含数字 9 的文件。

20.4.3. 有用的字符类别(由 POSIX 标准定义)

此信息取自 grep info 页面,并进行了少量编辑,请参阅参考书目中的 [10] 以获取更多信息。

Note这些与...一起使用
 

以上命令适用于大多数处理文本的工具(例如:tr)。

例如 (高级示例),此命令扫描 dir 命令的输出,并打印包含大写字母后跟数字的行

ls -l | grep '[[:upper:]][[:digit:]]'

该命令使用 grep 搜索 [大写字母][任何数字],表示任何大写字母后跟任何数字。如果您删除中间的 [ ](方括号),它将查找大写字母或数字,因为它将变成 [大写字母或任何数字]