shell之正则表达式
2021/11/8 7:11:22
本文主要是介绍shell之正则表达式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
一,正则表达式概述
1,正则表达式定义
2,元字符
2,表示次数
3,位置锚定
4,分组
5,扩展正则表达式
一,正则表达式概述
1,正则表达式定义
正则表达式,又称正规表达式,常规表达式
使用字符串来描述,匹配一系列符合某个规则的字符串(主要匹配命令结果和文本内容)
正则表示式组成:
普通字符:大小写字母,数字,标点符号及一些其他符号
元字符:在正则表达式中具有特殊意思的专用字符
2,元字符
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[zhou] [0-9] [] [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] a.z
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围
广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode 正则表达式会匹配全角空格符
例:
[root@localhost ~]# echo a.c|grep a.c
a.c
[root@localhost ~]# echo abc|grep a.c #正则表达式中.代表任意字符
abc
[root@localhost ~]# echo a.c|grep a\.c #带转义符\表示.本来的意思
a.c
[root@localhost ~]# echo abc|grep a\.c #不加引号可能与预想的结果不相符
abc
[root@localhost ~]# echo a.c|grep 'a\.c' #标准格式需加单引号或双引号
a.c
[root@localhost ~]# echo abc|grep 'a\.c'
[root@localhost ~]#
[root@localhost opt]# ls [a-d].txt #通配符中[a-d]表示
a.txt A.txt b.txt B.txt c.txt C.txt d.txt
[root@localhost opt]# ls |grep '[a-d].txt' #正则表达式中只表示小写字母
a.txt
b.txt
c.txt
d.txt
[root@localhost opt]# ls |grep '[abc].txt' #正则表达式中[abc]表示其中的任一个字符
a.txt
b.txt
c.txt
[root@localhost opt]# ls |grep '[A-D].txt' #正则表示中表示大写字母
A.txt
B.txt
C.txt
D.txt
[root@localhost opt]# ls |grep '[^A-D].txt' #正则表达式中^表示非,取反
a.txt
b.txt
c.txt
d.txt
2,表示次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
例:
[root@localhost opt]# echo goodboy|grep 'go\{2\}dboy' #匹配2个o
goodboy
[root@localhost opt]# echo gooodboy|grep 'go\{2,4\}dboy' #匹配2次以上4次以下o
gooodboy
[root@localhost opt]# echo gooodboy|grep 'go\{,4\}dboy' #匹配4次以下o
gooodboy
[root@localhost opt]# echo goooooodboy|grep 'go*dboy' #*表示任意次数
goooooodboy
[root@localhost opt]# echo gdboy|grep 'go*dboy'
gdboy
[root@localhost opt]# echo goodboy|grep 'g.*y' #.*表示任意的字符
goodboy
[root@localhost opt]# echo gdboy|grep 'go\?dboy' # \?表示匹配0次或1次
gdboy
[root@localhost opt]# echo godboy|grep 'go\?dboy'
godboy
[root@localhost opt]# echo goodboy|grep 'go\?dboy'
[root@localhost opt]#
[root@localhost opt]# echo gdboy|grep 'go\+dboy' # \+表示一次以上0次不能匹配
[root@localhost opt]# echo godboy|grep 'go\+dboy'
godboy
[root@localhost opt]# echo gooodboy|grep 'go\+dboy'
gooodboy
3,位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行 (单独一行 只有root)
^$ #空行
^[[:space:]]*$ #空白行
\< 或 \b #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b #词尾锚定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词
例:
[root@localhost opt]# cat /etc/passwd|grep '^root' #过滤出以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@localhost opt]# cat /etc/passwd|grep 'bash$' #过滤出以bash结尾的行
root:x:0:0:root:/root:/bin/bash
liuhuan:x:1000:1000:liuhuan:/home/liuhuan:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1002:1002::/opt/aa:/bin/bash
user4:x:1003:1003::/home/user4:/bin/bash
user5:x:1004:1004::/home/user5:/bin/bash
[root@localhost opt]# cat /etc/passwd|grep '^bash$' #过滤出以bash开头以bash结尾的行
bash
4,分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
或者:\|
5,扩展正则表达式
表示次数
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
正则表达式与扩展正则表达式相似,扩展正则表达式不需要转义符
这篇关于shell之正则表达式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-11正则表达式学习:入门指南与实践技巧
- 2024-08-15正则表达式入门:基础教程与实践指南
- 2024-01-0939. 干货系列从零用Rust编写负载均衡及代理,正则及格式替换
- 2024-01-08如何编写高效的正则表达式?
- 2023-12-29"Matlab中的正则表达式:强大而灵活的工具"
- 2023-09-30这个正则 为啥同样的单号第二个就提取不出来?
- 2023-06-086.2 re 正则表达式
- 2023-06-06将字符串里的\x01,\x02这些替换掉用正则表达式无效?
- 2023-05-24正则表达式详解
- 2023-05-17我让gpt写了一段正则表达式代码,可是运行报错,可以帮忙看看哪里出了问题?