Linux正则表达式
Linux正则表达式
一、 核心概念
正则表达式是一个由普通字符(如字母、数字)和元字符(特殊符号)组成的 pattern
(模式),用于描述、匹配一系列符合某种语法规则的字符串。
- 普通字符:没有特殊含义的字符,如
a
,1
,@
。 - 元字符:具有特殊功能的字符,如
.
,*
,^
,$
。 - 工具支持:
grep
,sed
,awk
,vim
,less
等工具及 Perl, Python 等编程语言都支持正则表达式。 - 两种风格:
- 基本正则表达式 (BRE):元字符需转义,功能较少。
- 扩展正则表达式 (ERE):使用
grep -E
或egrep
,支持更多元字符(如+
,?
,|
,()
),无需转义,更强大直观。
示例文件 words
内容:
cat
category
acat
concatenate
dog
cbt
c1t
cCt
c-t
c.t
hello cat
dg
doog
dooog
doooog
dogdog
dogdogdog
dogdogdogdog
二、 匹配单个字符
模式 | 描述 | 示例(grep 命令) | 匹配结果(来自 words ) |
---|---|---|---|
cat | 匹配普通字符本身 | grep 'cat' | cat , category , acat , concatenate |
[abc] | 字符集:匹配 [ ] 内任意一个字符 | grep 'c[ab]t' | cat , cbt |
[a-z] | 范围:匹配任意小写字母 [0-9] (数字), [A-Z] (大写字母) | grep 'c[a-z]t' grep 'c[0-9]t' | cat , cbt c1t |
[^abc] | 取反:匹配不在 [ ] 内的任意一个字符 注意:^ 必须在最前面 | grep 'c[^ab]t' | c1t , cCt , c-t (不匹配 cat , cbt ) |
. | 匹配任意一个字符(除换行符) | grep 'c.t' | cat , cbt , c1t , cCt , c-t |
\. | 转义:将元字符(如 . ) 变为普通字符 | grep 'c\.t' | c.t |
\ | 1. 转义元字符 2. 引入特殊序列(见下文) | grep 'c\.t' grep '\s' | c.t 匹配空格、制表符等 |
三、 匹配特殊字符(预定义字符集)
模式 | 描述 | 等价于 |
---|---|---|
[[:digit:]] | 数字 | [0-9] |
[[:alpha:]] | 字母 | [A-Za-z] |
[[:alnum:]] | 字母或数字 | [A-Za-z0-9] |
[[:space:]] | 空白字符(空格、制表符、换行符等) | [ \t\n\r\f\v] |
[[:punct:]] | 标点符号 | |
\s | 匹配任何空白字符 (grep 支持) | [[:space:]] |
\S | 匹配任何非空白字符 | [^[:space:]] |
\w | 匹配字母、数字、下划线 (grep 支持) | [A-Za-z0-9_] |
\W | 匹配任何非字母、数字、下划线 | [^A-Za-z0-9_] |
\n | 匹配换行符 |
四、 匹配位置(锚点)
模式 | 描述 | 示例(grep 命令) | 匹配结果(来自 words ) |
---|---|---|---|
^ | 匹配行首 | grep '^cat' | cat , category |
$ | 匹配行尾 | grep 'cat$' | cat , acat |
^cat$ | 精确匹配整行就是 cat | grep '^cat$' | cat |
\b | 匹配单词边界 (单词的开头或结尾) | grep '\bcat' grep 'cat\b' grep '\bcat\b' | cat , category cat , acat cat |
\B | 匹配非单词边界 | grep '\Bcat' | acat , concatenate (不在单词开头) |
\< \> | vim 等工具中的单词边界(左/右) | grep '\<cat' | 同 \bcat |
五、 匹配次数(量词)
⭐量词在扩展正则表达式 (ERE) 中更易用,需使用 grep -E
或 egrep
。
模式 | 描述 | 示例(egrep 命令) | 匹配结果(来自 words ) |
---|---|---|---|
* | 匹配前一个字符0次或多次(任意次) | grep 'do*g' (BRE 也可用) | dg , dog , doog |
+ | (ERE) 匹配前一个字符1次或多次 | egrep 'do+g' | dog , doog |
? | (ERE) 匹配前一个字符0次或1次(可选) | egrep 'do?g' | dg , dog |
{n} | (ERE) 匹配前一个字符恰好 n 次 | egrep 'do{2}g' | doog |
{m,n} | (ERE) 匹配前一个字符m 到 n 次 | egrep 'do{2,3}g' | doog , dooog |
{m,} | (ERE) 匹配前一个字符至少 m 次 | egrep 'do{2,}g' | doog , dooog , doooog |
{,n} | (ERE) 匹配前一个字符最多 n 次 | egrep 'do{,3}g' | dg , dog , doog , dooog |
六、 分组与反向引用
1. 分组 ( )
-
(ERE) 将多个字符作为一个整体,配合量词使用。
-
# 匹配连续出现2到3次的 "dog" [laoma@shell ~]$ egrep '(dog){2,3}' words dogdog dogdogdog # 匹配 (dog){3} dogdogdogdog # 匹配 (dog){4} (因为包含了{3}的情况)
2. 反向引用 \N
-
(ERE) 引用前面第N个分组
( )
匹配到的具体文本。-
\1
:引用第一个分组。 -
\2
:引用第二个分组,以此类推。
-
# 匹配重复的单词 (例如 "of of", "up up")
[laoma@shell ~]$ echo 'Is is the cost of of gasoline going up up?' | egrep -o '\b([a-z]+) \1\b'
of of
up up# 匹配连续出现多次的单词
[laoma@shell ~]$ echo 'Is is the cost of of of gasoline going up up?' | egrep -o '(\b[a-z]+\b\s+)\1{1,}'
of of of
七、 逻辑或
模式 | 描述 | 示例(egrep 命令) | 匹配结果(来自 words ) |
---|---|---|---|
` | ` | (ERE) 逻辑或 | `egrep 'cat |
八、 综合应用:匹配有效 IPv4 地址
目标:从杂乱数据中过滤出有效的 IPv4 地址(每个 octet 介于 0-255)。
测试数据 (ip.txt
):
0.0.0.0
1.1.1.1
11.11.11.111
111.111.111.111
999.9.9.9
01.1.1.1
10.0.0.0
0.1.1.1
266.1.1.1
248.1.1.1
256.1.1.1
解决方案:
# 使用 grep -E 匹配扩展正则表达式
grep -E '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b' ip.txt
分步解释:
\b
单词边界:确保是独立的IP,不是更大数字的一部分。(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
匹配 0-255:25[0-5]
:匹配 250-2552[0-4][0-9]
:匹配 200-249[01]?[0-9][0-9]?
:匹配 0-199 (兼容0
和01
等形式)
\.
匹配点号。{3}
重复3次:匹配前三个数字和点号 (X.X.X.)。- 最后再匹配一次 0-255,完成整个地址。
\b
单词边界:结束。
匹配结果:
0.0.0.0
1.1.1.1
11.11.11.111 # 111 是有效数字 (0-255)
111.111.111.111 # 111 是有效数字
10.0.0.0
0.1.1.1
248.1.1.1
# 排除掉了 999.9.9.9, 01.1.1.1, 266.1.1.1, 256.1.1.1
九、 速查表
目标 | 模式或符号 | 类别 | |
---|---|---|---|
任意字符 | . | 字符匹配 | |
数字 | [0-9] 或 [[:digit:]] 或 \d (部分工具) | 字符匹配 | |
非数字 | [^0-9] 或 [^[:digit:]] 或 \D (部分工具) | 字符匹配 | |
单词字符 | [A-Za-z0-9_] 或 \w | 字符匹配 | |
非单词字符 | [^A-Za-z0-9_] 或 \W | 字符匹配 | |
空白 | [[:space:]] 或 \s | 字符匹配 | |
非空白 | [^[:space:]] 或 \S | 字符匹配 | |
行首 | ^ | 位置匹配 | |
行尾 | $ | 位置匹配 | |
单词边界 | \b | 位置匹配 | |
0次或多次 | * | 次数匹配 | |
1次或多次 | + (ERE) | 次数匹配 | |
0次或1次 | ? (ERE) | 次数匹配 | |
精确n次 | {n} (ERE) | 次数匹配 | |
范围次 | {m,n} (ERE) | 次数匹配 | |
分组 | ( ) (ERE) | 高级特性 | |
反向引用 | \1 , \2 … (ERE) | 高级特性 | |
逻辑或 | ` | ` (ERE) | 高级特性 |
Linux的正则表达式介绍就到这里,希望这份笔记能帮助您更高效地学习和复习!