通配符在 GNU/Linux 系统和各种其他用途中非常有用。命令可以使用通配符 一次对多个文件执行操作,或者在文本文件中查找短语的一部分。通配符有很多用途,主要有两种使用通配符的方式,它们是 globbing 模式/标准通配符,通常由 shell 使用。另一种是正则表达式,在许多其他命令中很流行,并且在文本搜索和操作中也很流行。
提示: 如果你的文件中包含通配符表达式,那么你可以使用单引号来阻止 bash 扩展它们,或者使用反斜杠(转义字符),或者两者都用。
例如,如果你想创建一个名为 'fo*' (fo 和星号)的文件,你必须这样做(请注意,你不应该创建像这样的名称的文件,这只是一个例子)
touch '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} ~
这种构造类似于 [ ] 构造,除了不匹配括号内的任何字符,它将匹配任何字符,只要它没有在 [ 和 ] 之间列出。这是一个逻辑非。例如, 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” 结尾的行。
例如,此命令在文件 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 的文件。
此信息取自 grep info 页面,并经过少量编辑,有关更多信息,请参阅参考文献中的 [10]。
这些与以下工具一起使用: 上述命令适用于大多数处理文本的工具(例如:tr)。
例如(高级示例),此命令扫描 dir 命令的输出,并打印包含一个大写字母后跟一个数字的行:
ls -l | grep '[[:upper:]][[:digit:]]'
该命令使用 grep 搜索 [大写字母][任何数字],意思是任何大写字母后跟任何数字。如果你删除中间的 [ ] (方括号),它将查找大写字母或数字,因为它将变成 [大写字母 任何数字]