5 分钟快速掌握 shell 中的正则表达式

本文首发于众里千寻 - 5 分钟快速掌握 shell 中的正则表达式

我经常会在命令行使用 grep 等命令处理一些文本查找的问题。在使用正则表达式的时候经常会碰到一些令人困惑的问题,比如同样的正则表达式在一个命令中可以用,在另一个命令中却不可以用。

今天我们来好好整理下 shell 中的正则表达式,这样在使用的时候能够轻车熟路。

分类

正则表达式最早在 1950 年代由美国数学家 Stephen Cole Kleene 提出,后来被 Unix 操作系统的文本处理工具广泛使用。

经过多年的发展和实践,最终形成两大标准,一个是 POSIX 标准,另一个是 Perl 标准。后者本是为 Perl 语言实现的,由于其功能非常强大,被 Java、JavaScript 等语言广泛借鉴,从而被广泛使用。

我们这里将正则表达式分为三类:

  • 基本正则表达式(Basic Regular Expression 简称 BRE),由 POSIX 标准定义。
  • 扩展正则表达式(Extended Regular Expression 简称 ERE),也由 POSIX 标准定义。
  • Perl 的正则表达式(Perl Regular Expression 简称 PRE),由 Perl 语言定义。

组成部分

基本组成部分

下表展示了正则表达式的基本组成部分。

正则表达式 描述 示例 Basic RegEx Extended RegEx Perl regEx
\ 转义符,将特殊字符进行转义,忽略其特殊意义 a.b匹配a.b,但不能匹配ajb,.被转义为特殊意义 \ \ \
^ 匹配行首 ^tux匹配以tux开头的行 ^ ^ ^
$ 匹配行尾 tux$匹配以tux结尾的行 $ $ $
. 匹配除换行符\n之外的任意单个字符 ab.匹配abc或bad,不可匹配abcd或abde,只能匹配单字符 . . .
[] 匹配包含在[字符]之中的任意一个字符 coo[kl]可以匹配cook或cool [] [] []
[^] 匹配[^字符]之外的任意一个字符 123[^45]不可以匹配1234或1235,1236、1237都可以 [^] [^] [^]
[-] 匹配[]中指定范围内的任意一个字符,要写成递增 [0-9]可以匹配1、2或3等其中任意一个数字 [-] [-] [-]
? 匹配之前的项1次或者0次 colou?r可以匹配color或者colour,不能匹配colouur 不支持 ? ?
+ 匹配之前的项1次或者多次 sa-6+匹配sa-6、sa-666,不能匹配sa- 不支持 + +
* 匹配之前的项0次或者多次 co*l匹配cl、col、cool、coool等 * * *
() 匹配表达式,创建一个用于匹配的子串 ma(tri)?匹配max或maxtrix 不支持 () ()
匹配之前的项n次,n是可以为0的正整数 [0-9]{3}匹配任意一个三位数,可以扩展为[0-9][0-9][0-9] 不支持
之前的项至少需要匹配n次 [0-9]{2,}匹配任意一个两位数或更多位数 不支持
指定之前的项至少匹配n次,最多匹配m次,n<=m [0-9]{2,5}匹配从两位数到五位数之间的任意一个数字 不支持
| 交替匹配|两边的任意一项 ab(c|d)匹配abc或abd 不支持 | |

POSIX 字符类

POSIX字符类是一个形如[:...:]的特殊元序列(meta sequence),他可以用于匹配特定的字符范围。

正则表达式 描述 示例 Basic RegEx Extended RegEx Perl RegEx
[:alnum:] 匹配任意一个字母或数字字符 [[:alnum:]]+ [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任意一个字母字符(包括大小写字母) [[:alpha:]] [:alpha:] [:alpha:] [:alpha:]
[:blank:] 空格与制表符(横向和纵向) [[:blank:]]* [:blank:] [:blank:] [:blank:]
[:digit:] 匹配任意一个数字字符 [[:digit:]]? [:digit:] [:digit:] [:digit:]
[:lower:] 匹配小写字母 [[:lower:]] [:lower:] [:lower:] [:lower:]
[:upper:] 匹配大写字母 ([[:upper:]]+)? [:upper:] [:upper:] [:upper:]
[:punct:] 匹配标点符号 [[:punct:]] [:punct:] [:punct:] [:punct:]
[:space:] 匹配一个包括换行符、回车等在内的所有空白符 [[:space:]]+ [:space:] [:space:] [:space:]
[:graph:] 匹配任何一个可以看得见的且可以打印的字符 [[:graph:]] [:graph:] [:graph:] [:graph:]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [[:xdigit:]]+ [:xdigit:] [:xdigit:] [:xdigit:]
[:cntrl:] 任何一个控制字符(ASCII字符集中的前32个字符) [[:cntrl:]] [:cntrl:] [:cntrl:] [:cntrl:]
[:print:] 任何一个可以打印的字符 [[:print:]] [:print:] [:print:] [:print:]

元字符

元字符(meta character)是一种 Perl 风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持。

正则表达式 描述 示例 Basic RegEx Extended RegEx Perl RegEx
\b 单词边界 \bcool\b 匹配cool,不匹配coolant \b \b \b
\B 非单词边界 cool\B 匹配coolant,不匹配cool \B \B \B
\d 单个数字字符 b\db 匹配b2b,不匹配bcb 不支持 不支持 \d
\D 单个非数字字符 b\Db 匹配bcb,不匹配b2b 不支持 不支持 \D
\w 单个单词字符(字母、数字与_) \w 匹配1或a,不匹配& \w \w \w
\W 单个非单词字符 \W 匹配&,不匹配1或a \W \W \W
\n 换行符 \n 匹配一个新行 不支持 不支持 \n
\s 单个空白字符 x\sx 匹配x x,不匹配xx 不支持 不支持 \s
\S 单个非空白字符 x\S\x 匹配xkx,不匹配xx 不支持 不支持 \S
\r 回车 \r 匹配回车 不支持 不支持 \r
\t 横向制表符 \t 匹配一个横向制表符 不支持 不支持 \t
\v 垂直制表符 \v 匹配一个垂直制表符 不支持 不支持 \v
\f 换页符 \f 匹配一个换页符 不支持 不支持 \f

常见命令中的使用

命令 Basic RegEx Extended RegEx Perl RegEx
grep 支持 需加 -E 参数 需加 -P 参数
egrep 支持 支持 需加 -P 参数
sed 支持 需加 -r 参数 不支持
awk 支持 支持 不支持

常见面试知识点、技术解决方案、教程,都可以扫码关注公众号“众里千寻”获取,或者来这里 https://everfind.github.io

众里千寻

posted @ 2021-12-10 10:38  西风D碧树  阅读(356)  评论(0编辑  收藏  举报