表 1 显示了一些常用的正则表达式操作符。您可以连接表 1 中显示的元素(以及其他操作符)并加以组合使用,从而构建(非常)复杂的正则表达式。
表 1. 常用的正则表达式操作符
操作符
用途
.(句号)
匹配任意单个字符。
^(脱字号)
匹配出现在行首或字符串开始位置的空字符串。
$(美元符号)
匹配出现在行末的空字符串。
A
匹配大写字母 A。
a
匹配小写字母 a。
/d
匹配任意一位数字。
/D
匹配任意单个非数字字符。
/w
匹配任意单个字母数字字符,同义词是 [:alnum:]。
[A-E]
匹配任意大写的 A、B、C、D 或 E。
[^A-E]
匹配除 A、B、C、D 和 E 之外的任意字符。
X?
匹配出现零次或一次的大写字母 X。
X*
匹配零个或任意个大写 X。
X+
匹配一个或多个字母 X。
X{n}
精确匹配 n 个字母 X。
X{n,m}
匹配最少 n 个并且不超过 m 个字母 X。如果省略 m,表达式将尝试匹配最少 n 个 X。
(abc|def)+
匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配。
以下是一些使用 grep 作为搜索工具的正则表达式示例。许多其他 UNIX 工具,包括交互式编辑器 vi 和 Emacs、流编辑器 sed 和 awk,以及所有现代编程语言都支持正则表达式。在您学会正则表达式的语法(也许相当晦涩)之后,就可以将您的专业知识灵活运用到不同的工具、编程语言和操作系统。
查找以“Bat”开头的名称
要查找以“Bat”开头的名称,请使用:
grep -E '^Bat'
可以使用 -E 选项来指定正则表达式。^(脱字号)字符匹配行首或字符串的开头,这是一个出现在每行或每个字符串开头字符之前的假想字符。字母 B、a 和 t 只具有字面含义并且仅匹配那些特定的字符。因此,命令 grep -E '^Bat' 将生成:
Batman
Batgirl
由于许多 regex 操作符也为 Shell 所使用(其中一些具有不同的用途,另外一些则有类似的用途),因此一个好的习惯是使用单引号将命令行中的每个 regex 括起来,以保护 regex 操作符免遭 Shell 的误解。例如,*(星号)和 $(美元符号)都是 regex 操作符,并且对于您的 Shell 具有特殊的含义。
查找以“man”结尾的名称
要查找以“man”结尾的名称,可以使用 regex man$ 来匹配序列 m、a 和 n,并且后面紧接与 regex 操作符 $ 匹配的行(字符串)。
查找空行
基于 ^ 和 $ 的作用,您可以使用 regex ^$ 来查找空行(相当于在开始之后立即结束的行)。
备选项或集合操作符
要查找以“bat”、“Bat”、“cat”或“Cat”开头的单词,可以使用以下两个技巧。首先是备选项,如果备选项中的任意 模式匹配,都会产生匹配的结果。例如,命令:
grep -E '^(bat|Bat|cat|Cat)' heroes.txt
可实现这一技巧。regex 操作符 |(竖线)表示备选项,因此 this|that 匹配字符串 this 或字符串 that。因此,^(bat|Bat|cat|Cat) 表示“行首紧跟 bat、Bat、cat 或 Cat之一。”当然,可以使用 grep -i 来简化该 regex,这样可以忽略大小写,从而将命令简化为:
grep -i -E '^(bat|cat)' heroes.txt
匹配“bat”、“Bat”、“cat”或“Cat”的另一个方法是使用 [ ](方括号)集合 操作符。如果将一组字符放在一个集合中,则可以匹配那些字符中的任意一个。(您可以将集合 看作是字符备选项的简写法。)
例如,命令行:
grep -E '^[bcBC]at' heroes.txt
与以下命令生成的结果相同:
grep -E '^(bat|Bat|cat|Cat)' heroes.txt
您可以再次使用 -i 将 regex 简化为 ^[bc]at。