UNIX/LINUX SHELL 正则表达式语法详解附使用方法(2)

表 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。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjxfys.html