Linux 正则表达式

Linux 正则表达式

正则表达式基础概念

定义与作用

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

组成结构

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

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

应用范围

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

正则表达式分类

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

环境准备

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

[root@client ~ 09:26:37]# vim word
cat
category
acat
concatenate
dog

核心匹配规则与示例

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

[root@client ~ 09:26:57]# cat word | grep 'cat'
cat
category
acat
concatenate

字符集匹配

[..]:匹配括号内任意一个字符
[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)-
  • 特殊符号处理:若需匹配-,需将其放在字符集第一个位置

[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
[^..]:匹配除括号内字符外的所有字符
[root@client ~ 09:30:00]# cat word | grep 'c[^a-z]t'
c1t
c2t 
c3t 
c4t 
c5t
cAt

通配符

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

转义字符

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

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

多条件选择

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

[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

[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”)
[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”,输出对应内容)
[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值