通配符

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

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

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

  touch 'fo*' 
  

请注意,关于通配符的两个小节的部分内容是基于 grep 手册和 info 页面编写的(至少部分如此)。有关更多信息,请参阅参考文献

标准通配符 (globbing 模式)

标准通配符(也称为 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。这种通配符指定“或”关系(你只需要匹配其中一个)。

|

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

[^]

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

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

此信息取自 grep info 页面,并经过少量编辑,有关更多信息,请参阅参考文献中的 [10]。

这些与以下工具一起使用: 上述命令适用于大多数处理文本的工具(例如:tr)。

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

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

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