通配符在 GNU/Linux 系统和各种其他用途中非常有用。命令可以使用通配符一次对多个文件执行操作,或在文本文件中查找短语的一部分。通配符有很多用途,主要有两种不同的通配符使用方式:globbing 模式/标准通配符,它们通常被 shell 使用。另一种是正则表达式,在许多其他命令中很流行,并且常用于文本搜索和操作。
![]() | 提示 | |
---|---|---|
如果您的文件包含通配符表达式,那么您可以使用单引号来阻止 bash 扩展它们,或者使用反斜杠(转义字符),或者两者都使用。 例如,如果您想创建一个名为 'fo*'(fo 和星号)的文件,您必须这样做(请注意,您不应该创建名称像这样的文件,这只是一个例子)
|
请注意,关于通配符的两个小节的部分内容(至少部分地)基于 grep 手册和 info 页面。请参阅参考书目以获取更多信息。
标准通配符(也称为 globbing 模式)被各种命令行实用程序用于处理多个文件。有关标准通配符(globbing 模式)的更多信息,请键入以下命令参考手册页
man 7 glob |
![]() | 可用于 |
---|---|
标准通配符几乎可以被任何命令使用(包括 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 的文件。
用作“转义”字符,即保护后续的特殊字符。因此,"\\" 搜索反斜杠。请注意,您可能需要使用引号和反斜杠。
正则表达式是一种 globbing 模式,用于处理文本。它们用于任何形式的文本多部分操作,以及用于处理文本的各种编程语言。有关正则表达式的更多信息,请参阅手册页或尝试在线教程,例如 IBM Developerworks 使用正则表达式。对于手册页,键入
键入
man 7 regex |
![]() | 正则表达式可用于 |
---|---|
正则表达式被 grep 使用(并且可以被 find 和许多其他程序使用)。 |
![]() | 提示 |
---|---|
如果您的正则表达式似乎不起作用,那么您可能需要在句子上使用单引号,然后在每个特殊字符上使用反斜杠。 |
将匹配任何单个字符,等同于标准通配符表达式中的 ?(问号)。因此,"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 的文件。
此信息取自 grep info 页面,并进行了少量编辑,请参阅参考书目中的 [10] 以获取更多信息。
[:upper:] 大写字母
[:lower:] 小写字母
[:alpha:] 字母 (字符) 意为大写+小写 (包括大写和小写字母)
[:digit:] 十进制数字,0 到 9
[:alnum:] 字母数字 意为 字母+数字 (任何大写或小写字母或任何十进制数字)
[:space:] 空白字符 意为空格、制表符、换行符和类似字符
[:graph:] 图形可打印字符,不包括空格
[:print:] 可打印字符,包括空格
[:punct:] 标点符号字符 意为 图形字符 减去 字母和数字
[:cntrl:] 控制字符 意为 不可打印字符
[:xdigit:] 十六进制数字字符。
![]() | 这些与...一起使用 |
---|---|
以上命令适用于大多数处理文本的工具(例如:tr)。 |
例如 (高级示例),此命令扫描 dir 命令的输出,并打印包含大写字母后跟数字的行
ls -l | grep '[[:upper:]][[:digit:]]' |
该命令使用 grep 搜索 [大写字母][任何数字],表示任何大写字母后跟任何数字。如果您删除中间的 [ ](方括号),它将查找大写字母或数字,因为它将变成 [大写字母或任何数字]