文章说明
文章作者:鴻塵
文章链接:https://hwame.top/20220116/shell-regular-expression.html
参考资料:
1.定义
正则表达式(regular expression)是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,它描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep
、egrep
、GUN sed
、 awk
等) 的用法。
2.正则表达式分类
- 基本的正则表达式(Basic Regular Expression,又叫 Basic RegEx,简称 BREs);
- 扩展的正则表达式(Extended Regular Expression,又叫 Extended RegEx,简称 EREs);
- Perl 的正则表达式(Perl Regular Expression,又叫 Perl RegEx,简称 PREs)。
3.Linux常用文本工具与正则表达式的关系
常握 Linux 下几种常用文本工具的特点,对于我们更好的使用正则表达式是很有帮助的。
表格内容来自参考资料 《shell-正则表达式》,暂未对其验证。
命令 | BREs | EREs | PREs | 处理模式 |
---|---|---|---|---|
grep |
默认 | -E 参数 |
-P 参数 |
行 |
egrep |
—— | 默认 | -P 参数 |
行 |
sed |
默认 | -r 参数 |
—— | 行 |
awk |
—— | 默认 | —— | 列 |
4.正则表达式比较
注释见表格下方。
字符 | BREs | EREs | Python | PREs | 说明 |
---|---|---|---|---|---|
\ |
\ |
\ |
\ |
\ |
转义字符 |
^ |
^ |
^ |
^ |
^ |
匹配行首[1] |
$$` | `$$ | $$` | `$$ | $ |
匹配行尾[2] |
^$ |
^$ |
^$ |
^$ |
^$ |
匹配空行 |
\< |
\< |
\< |
—— | —— | 匹配单词开头[3],等价于\b |
\> |
> |
\> |
—— | —— | 匹配单词结尾,等价于\b |
\<string\> |
\<string\> |
\<string\> |
—— | —— | 匹配单词或特定字符string [4] |
() |
\(\) |
() |
() |
() |
匹配表达式[5] |
? |
\? |
? |
? |
? |
匹配0次或1次[6] |
? |
—— | —— | —— | —— | 非贪婪匹配[7] |
. |
. |
. |
. |
. |
匹配任意单个字符[8] |
* |
* |
* |
* |
* |
匹配0次或多次 |
+ |
\+ |
+ |
+ |
+ |
匹配1次或多次 |
{n} |
\{n\} |
{n} |
{n} |
{n} |
匹配n次 |
{n,} |
\{n,\} |
{n,} |
{n,} |
{n,} |
匹配大于等于n次 |
{n,m} |
\{n,m\} |
{n,m} |
{n,m} |
{n,m} |
匹配n~m次[9] |
x|y |
x|y |
x|y |
x|y |
x|y |
匹配x 或y [10] |
[0-9] |
[0-9] |
[0-9] |
[0-9] |
[0-9] |
匹配一个数字字符[11] |
[xyz] |
[xyz] |
[xyz] |
[xyz] |
[xyz] |
匹配字符集合中的任一字符[12] |
[^xyz] |
[^xyz] |
[^xyz] |
[^xyz] |
[^xyz] |
匹配字符集合以外的任一字符[13] |
[A-Za-z] |
[A-Za-z] |
[A-Za-z] |
[A-Za-z] |
[A-Za-z] |
匹配任一字母 |
[^A-Za-z] |
[^A-Za-z] |
[^A-Za-z] |
[^A-Za-z] |
[^A-Za-z] |
匹配除字母外的任一字符 |
\d |
—— | —— | \d |
\d |
匹配任一数字字符,等价于[0-9] |
\D |
—— | —— | \D |
\D |
匹配任一非数字字符,等价于[^0-9] |
\s |
—— | —— | \s |
\s |
匹配任一空白字符,等价于[\f\n\r\t\v] |
\S |
—— | —— | \S |
\S |
匹配任一非空白字符,等价于[^\f\n\r\t\v] |
\w |
\w |
\w |
\w |
\w |
匹配任一单词字符,等价于[A-Za-z0-9_] |
\W |
\W |
\W |
\W |
\W |
匹配任一非单词字符,等价于[^A-Za-z0-9_] |
\b |
\b |
\b |
\b |
\b |
匹配单词边界,即单词和空格间的位置 |
\B |
\B |
\B |
\B |
\B |
匹配非单词边界 |
\t |
—— | —— | \t |
\t |
匹配一个横向制表符,等价于\x09 和\cI |
\v |
—— | —— | \v |
\v |
匹配一个垂直制表符,等价于\x0b 和\cK |
\n |
—— | —— | \n |
\n |
匹配一个换行符,等价于\x0a 和\cJ |
\f |
—— | —— | \f |
\f |
匹配一个换页符,等价于\x0c 和\cL |
\r |
—— | —— | \r |
\r |
匹配一个回车符,等价于\x0d 和\cM |
\\ |
\ |
\\ |
\\ |
\\ |
匹配一个转义字符\ 本身 |
\cx |
—— | —— | \cx |
匹配由x 指明的控制字符[14] |
|
\xn |
—— | —— | \xn |
匹配十六进制n [15] |
|
\num |
—— | \num |
\num |
匹配引用 | |
[:alnum:] |
[:alnum:] |
[:alnum:] |
[:alnum:] |
[:alnum:] |
匹配任一字母或数字字符,等价于[A-Za-z0-9] |
[:alpha:] |
[:alpha:] |
[:alpha:] |
[:alpha:] |
[:alpha:] |
匹配任一字母字符,等价于[A-Za-z] |
[:digit:] |
[:digit:] |
[:digit:] |
[:digit:] |
[:digit:] |
匹配任一数字,等价于[0-9] |
[:lower:] |
[:lower:] |
[:lower:] |
[:lower:] |
[:lower:] |
匹配任一小写字母,等价于[a-z] |
[:upper:] |
[:upper:] |
[:upper:] |
[:upper:] |
[:upper:] |
匹配任一大写字母,等价于[A-Z] |
[:space:] |
[:space:] |
[:space:] |
[:space:] |
[:space:] |
匹配任一空白字符 |
[:blank:] |
[:blank:] |
[:blank:] |
[:blank:] |
[:blank:] |
匹配空格和制表符 |
[:graph:] |
[:graph:] |
[:graph:] |
[:graph:] |
[:graph:] |
匹配任一可见且可打印的字符[16] |
[:print:] |
[:print:] |
[:print:] |
[:print:] |
[:print:] |
匹配任一可打印字符[17] |
[:cntrl:] |
[:cntrl:] |
[:cntrl:] |
[:cntrl:] |
[:cntrl:] |
匹配任一控制字符[18] |
[:punct:] |
[:punct:] |
[:punct:] |
[:punct:] |
[:punct:] |
匹配任一标点符号[19] |
[:xdigit:] |
[:xdigit:] |
[:xdigit:] |
[:xdigit:] |
[:xdigit:] |
匹配任一十六进制数,即[0-9a-fA-F] |
注释:
[1] ^string
匹配以字符串string
开头的行,在awk
中则是匹配字符串的开始(因为awk
以列为单位)。
[2] ^string
匹配以字符串string
结尾的行,在awk
中则是匹配字符串的结束(因为awk
以列为单位)。
[3] \<
和\>
匹配单词时等价于\b
,\<string
和string\>
分别表示以string
开头和结尾的单词。PREs中不支持此方式,但可用\b
的等价写法。
[4] \<string\>
匹配特定单词或字符string
,等价于\bstring\b
。PREs中不支持此方式,但可用\b
的等价写法。
[5] ()
表示对匹配的表达式分组,可以\num
形式引用。
[6] ?
表示匹配前面的子表达式0次或1次,等价于\{0,1\}
,例如where(is)
可匹配where
及whereis
。
[7] 若子表达式为 限制符(*
、+
、?
、{n}
、{n,}
、{n,m}
) 时表示非贪婪匹配,本文涉及的正则表达式用法不支持此方式(存疑),但可使用 修饰符U
(见下文)。
[8] .
匹配除换行符之外的任一字符,在awk
中能匹配换行符。如果要匹配包括换行符在内的任一字符,则在EREs中可使用(^$)|(.)
,在Perl RE中可使用[.\n]
。
[9] 最少匹配n
次,且最多匹配m
次。注意在逗号和两个数之间不能有空格。
[10] 由于半角|
作为表格单元格分隔符且优先解析,即使写在行内代码中也会被解析成单元格,故此处使用全角|
。
[11] 数字需写成递增顺序。
[12] 若元字符(例如.
、*
等)置于方括号中,则将作为普通字符。
[13] [^xyz]
表示负值字符集合且不包括换行符,在awk中表示匹配 未包含的任一字符+换行符
。
[14] \cx
匹配由x
指明的控制字符即Control-x
或回车符,x
的值必须为A-Z
或a-z
之一,否则将c
视为一个原义的字符c
。
[15] \xn
匹配十六进制转义值n
,十六进制转义值必须为确定的两个数字长。例如:\x41
匹配A
(正则表达式中可以使用 ASCII 编码,十六进制41=十进制65);而\x041
则等价于\x04
+1
。
[16] [:graph:]
不包括空格和换行符等。
[17] [:print:]
不包括控制字符[:cntrl:]
、字符串结束符\0
、EOF文件结束符(-1), 但包括空格符号。
[18] 控制字符[:cntrl:]
指 ASCII 字符集中的前 32 个字符,即用十进制表示为从 0 到 31,例如换行符、制表符等。
[19] 标点符号[:punct:]
不包括[:alnum:]
、[:cntrl:]
、[:space:]
等字符集。
5.说明
- 当使用 BERs(基本正则表达式)时,必须在特殊符号前加上转义字符(
\
),以屏蔽掉它们的特殊含义。特殊符号有?
、+
、|
、{
、}
、(
、)
。 - 修饰符用在正则表达式结尾,例如
/dog/i
中的i
就是修饰符,表示匹配时不区分大小写。常见的修饰符如下:g
,表示全局匹配(即:一行上的每个出现,而不只是一行上的第一个出现);s
,表示把整个匹配串当作一行处理;m
,表示多行匹配;i
,表示忽略大小写;x
,表示允许注释和空格的出现;U
,表示非贪婪匹配。
- 111