Linux 正则表达式

文章目录

Linux 正则表达式

正则表达式基础概念

定义与作用

正则表达式是一种用于匹配字符串的模式(pattern),通过将该模式与目标字符串对比,实现对一个或多个特定字符串的查找。它广泛应用于文本处理场景,如搜索、过滤、替换等。

组成结构

正则表达式由普通字符元字符组成,具体如下:

  • 普通字符:未被指定为元字符的所有可打印与不可打印字符,涵盖所有大小写字母(a-z、A-Z)、数字(0-9)、标点符号(如逗号、句号)及其他符号。
  • 元字符 :除普通字符外,具有特殊功能的字符,用于定义匹配规则(如[ ]^$等)。

应用范围

  • 工具:vim(文本编辑器)、grep(文本搜索)、less(分页查看)等。
  • 编程语言:Perl、Python、C 等。

正则表达式分类

类别 特点 适用场景
普通正则表达式 支持基础元字符,功能较简洁 简单的文本匹配、搜索任务
扩展正则表达式 支持更多元字符(如+?{}),功能更丰富 复杂的匹配需求(如限定字符出现次数、多条件选择)

环境准备

word文件为示例,初始内容通过以下命令创建和查看:

bash 复制代码
[root@client ~ 09:26:37]# vim word
cat
category
acat
concatenate
dog

核心匹配规则与示例

直接使用普通字符作为匹配模式,查找包含该字符的字符串。

bash 复制代码
[root@client ~ 09:26:57]# cat word | grep 'cat'
cat
category
acat
concatenate

字符集匹配

[..]:匹配括号内任意一个字符
bash 复制代码
[root@client ~ 09:27:32]# echo cbt >> word 
[root@client ~ 09:27:50]# echo c{1..5}t >> word 
[root@client ~ 09:28:00]# cat word | grep 'c[45]t'
c1t c2t c3t c4t c5t
[root@client ~ 09:28:21]# vim word 
[root@client ~ 09:28:50]# cat word | grep 'c[45]t'
c4t 
c5t
[root@client ~ 09:28:53]# cat word | grep 'c[ab]t'
cat
category
acat
concatenate
cbt
  • 预设字符范围

    字符集 含义 等价写法
    [a-z] 匹配所有小写字母 -
    [A-Z] 匹配所有大写字母 -
    [0-9] 匹配所有数字 -
    [a-zA-Z0-9] 匹配所有字母和数字 [[:alnum:]]
    [a-z] 匹配所有小写字母 [[:lower:]]
    [A-Z] 匹配所有大写字母 [[:upper:]]
    [0-9] 匹配所有数字 [[:digit:]]
    [[:xdigit:]] 匹配十六进制数字(0-9、A-F、a-f) -
    [[:alpha:]] 匹配所有字母(大小写) [a-zA-Z]
    [[:blank:]]/[[:space:]] 匹配空白字符(制表符、换行符、空格等) -
    [[:punct:]] 匹配标点符号(如 $、&、()、* 等) -
    [[:print:]]/[[:graph:]] 匹配可打印字符(字母、数字、标点) -
    [[:cntrl:]] 匹配控制字符(ASCII 中 000-037、177) -
  • 特殊符号处理 :若需匹配-,需将其放在字符集第一个位置

bash 复制代码
[root@client ~ 09:29:01]# cat word | grep 'c[0-9]t'
c1t
c2t 
c3t 
c4t 
c5t
[root@client ~ 09:29:13]# cat word | grep 'c[a-z]t'
cat
category
acat
concatenate
cbt
[root@client ~ 09:29:20]# echo cAt >> word 
[root@client ~ 09:29:35]# cat word | grep 'c[a-z]t'
cat
category
acat
concatenate
cbt
[root@client ~ 09:29:38]# cat word | grep 'c[a-zA-Z0-9]t'
cat
category
acat
concatenate
cbt
c1t
c2t 
c3t 
c4t 
c5t
cAt
[^..]:匹配除括号内字符外的所有字符
bash 复制代码
[root@client ~ 09:30:00]# cat word | grep 'c[^a-z]t'
c1t
c2t 
c3t 
c4t 
c5t
cAt

通配符

bash 复制代码
[root@client ~ 09:30:30]# cat word | grep 'c.t'
cat
category
acat
concatenate
cbt
c1t
c2t 
c3t 
c4t 
c5t
cAt

转义字符

将下一个字符标记为 "原义字符" 或 "特殊字符",常见场景:

bash 复制代码
[root@client ~ 09:31:03]# echo c.t >> word 
[root@client ~ 09:31:16]# cat word | grep 'c\.t'
c.t

多条件选择

扩展正则表达式的元字符,用于匹配 "多个选项中的一个"。普通正则需用\|,扩展正则(egrepgrep -E)直接用|

bash 复制代码
[root@client ~ 09:31:18]# cat word | grep -E 'cat|dog'
cat
category
acat
concatenate
dog

非打印字符

终端中不显示的字符,需通过特殊转义序列匹配,常见如下:

转义序列 含义 等价写法
\cx 匹配控制字符(如\cM匹配回车符) -
\f 匹配换页符 \x0c\cL
\n 匹配换行符 \x0a\cJ
\r 匹配回车符 \x0d\cM
\s 匹配任意空白字符(空格、制表符等) [ \f\n\r\t\v]
\S 匹配任意非空白字符 [^ \f\n\r\t\v]
\w 匹配字母、数字、下划线 [A-Za-z0-9_]
\W 匹配非单词字符 [^A-Za-z0-9_]
\t 匹配制表符 \x09\cI
\v 匹配垂直制表符 \x0b\cK

说明 :grep 命令支持\w\W\s\S

bash 复制代码
[root@client ~ 09:31:18]# cat word | grep -E 'cat|dog'
cat
category
acat
concatenate
dog
[root@client ~ 09:31:39]# ls
anaconda-ks.cfg  word
[root@client ~ 09:39:03]# touch cbt
[root@client ~ 09:39:18]# cat word | grep c*t
cbt
[root@client ~ 09:39:27]# cat word | grep 'c*t'
cat
category
acat
concatenate
cbt
c1t
c2t 
c3t 
c4t 
c5t
cAt
c.t

定位符

用于限定字符串在 "行" 或 "单词" 中的位置,常见如下:

定位符 功能 示例
^ 匹配行首位置 grep '^cat' words(匹配以 "cat" 开头的行,输出 "cat")
$ 匹配行末位置 grep 'cat$' words(匹配以 "cat" 结尾的行,输出 "cat""acat")
\b 匹配单词边界(单词与非单词的分隔处) grep '\bcat' words(匹配 "cat" 作为单词开头,输出 "cat""category""hello cat");grep 'cat\b' words(匹配 "cat" 作为单词结尾,输出 "cat""acat""hello cat")
\B 匹配非单词边界 grep '\Bcat' words(匹配 "cat" 不在单词边界,输出 "acat""concatenate")
< 匹配单词左边界 grep '\<cat' words(同\bcat,输出 "cat""category""hello cat")
> 匹配单词右边界 grep 'cat\>' words(同cat\b,输出 "cat""acat""hello cat")
bash 复制代码
[root@client ~ 10:01:42]# cat word | grep '^cat'
cat
category
[root@client ~ 10:01:57]# cat word | grep 'cat$'
cat
acat
[root@client ~ 10:02:05]# echo hello cat >> word 
[root@client ~ 10:02:22]# cat word | grep '\bcat'
cat
category
hello cat
[root@client ~ 10:02:30]# cat word | grep 'cat\b'
cat
acat
hello cat
[root@client ~ 10:02:41]# cat word | grep '\bcat\b'
cat
hello cat
[root@client ~ 10:02:51]# cat word | grep '\Bcat'
acat
concatenate

限定次数

通过元字符限定 "前面子表达式" 的出现次数,仅在扩展正则(egrep/grep -E)中生效

限定符 功能 示例
* 匹配前面子表达式任意次数(0 次及以上) grep -E 'do*g' words(匹配 "dg""dog""doog",输出 "dg""dog""doog")
+ 匹配前面子表达式1 次及以上 grep -E 'do+g' words(匹配 "dog""doog",输出 "dog""doog")
? 匹配前面子表达式0 次或 1 次 grep -E 'do?g' words(匹配 "dg""dog",输出 "dg""dog")
{m} 匹配前面子表达式恰好 m 次 grep -E 'do{2}g' words(匹配 "doog",输出 "doog")
{m,n} 匹配前面子表达式m-n 次(含 m 和 n) grep -E 'do{2,3}g' words(匹配 "doog""dooog",输出 "doog""dooog")
{m,} 匹配前面子表达式m 次及以上 grep -E 'do{2,}g' words(匹配 "doog""dooog""doooog",输出对应内容)
{,n} 匹配前面子表达式0-n 次 grep -E 'do{,3}g' words(匹配 "dg""dog""doog""dooog",输出对应内容)
bash 复制代码
[root@client ~ 10:22:03]# echo dg >> word 
[root@client ~ 10:22:23]# echo dog >> word 
[root@client ~ 10:22:33]# echo dooog >> word 
[root@client ~ 10:22:37]# cat word | grep 'do*g'
dog
dg
dog
dooog
[root@client ~ 10:22:53]# cat word | grep 'do+g'
[root@client ~ 10:23:05]# cat word | egrep 'do+g'
dog
dog
dooog
[root@client ~ 10:23:16]# cat word | egrep 'do?g'
dog
dg
dog
[root@client ~ 10:23:25]# cat word | egrep 'do{3}g'
dooog
[root@client ~ 10:23:53]# cat word | egrep 'do{0,3}g'
dog
dg
dog
dooog
[root@client ~ 10:24:04]# cat word | egrep 'do{1,}g'
dog
dog
dooog
[root@client ~ 10:24:13]# cat word | egrep 'do{,1}g'
dog
dg
dog
相关推荐
金色熊族3 小时前
ubuntu20.04编译qt源码5.15.3
linux·c++·qt
zhaotiannuo_19984 小时前
【Linux CentOS 7 版本更换yum源】
linux
利刃大大4 小时前
【高并发服务器:前置知识】一、项目介绍 && 模块划分
运维·服务器·高并发·项目·cpp
aitav04 小时前
⚡ WSL2 搭建 s5p6818 Linux 嵌入式开发平台(part 1):环境准备与架构设计
linux·嵌入式·wsl·wsl2
init_23615 小时前
路由策略和流量策略的常见配置
运维·服务器·网络
一袋米扛几楼985 小时前
【软件安全】fgets / strncpy / gets(不安全) / snprintf的对比
linux·服务器·安全
cpsvps6 小时前
海外云服务器压力测试,如何评估服务器性能与稳定性
运维·服务器·压力测试
防搞活机6 小时前
ubuntu 服务器(带NVLink)更新显卡驱动 (巨坑!!)
linux·服务器·深度学习·ubuntu·gpu算力·显卡驱动
不是编程家6 小时前
Linux第二十二讲:数据链路层 && NAT && 代理服务 && 内网穿透
linux·运维·服务器