当前位置:网站首页>十二、正则表达式
十二、正则表达式
2022-07-26 22:44:00 【JXin-xxx】
十二、正则表达式
正则表达式又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式的文本。
正则表达式不只有一种,而且LINUX中不同的程序可能会使用不同的正则表达式。工具:grep、sed、awk、egrep
正则表达式是由普通字符与元字符组成
普通字符包括大小写字母、数字、标点符号及一些其他符号
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
LINUX中常用的有两种正则表达式引擎
基础正则表达式:BRE
扩展正则表达式:ERE
grep [选项] … 查找条件 目标文件
-E:开展扩展(Extend)的正则表达式
-c:计算找到“搜寻字符串”的次数
-i:忽略大小写的不同,所以大小写视为相同
-o:只显示被模式匹配到的字符串
-v:反向选择,亦即显示出没有 “搜寻字符串”内容的那一行!(反向查找,输出与查找条件下不相符的行)
–color=auto :可以将找到的关键词部分加上颜色的显示
-n:顺被输出行号
grep -c root /etc/passwd #统计root字符总行数;或cat /etc/passwd | grep root
grep -i "IPADDR" ifcfg-ens33 #不区分大小写查找IPADDR所有的行
grep -v root /etc/passwd #将/etc/passwd ,将没有出现root的行取出来
grep -v '^$' > test.txt #将非空行写入到test.txt文件中
[[email protected] opt]# ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" | head -1
20.0.0.57 #过滤出IP
基础正则表达式常见元字符:(支持的工具:grep、egrep、sed、awk)
特殊字符
\:转义符,将特殊符进行转义,忽略其特殊意义a \ .b匹配a.b,但不能匹配ajb,.被转义为特殊意义
^:匹配行首,^则是匹配字符串的开始^tux匹配以tux开头的行
$:匹配行尾,$则是匹配字符串的结尾tux$匹配以tux结尾的行
. :匹配除换行符\r\n之外的任意单个字符
[ list ] :匹配list列表中的一个字符
[ list ] :匹配任意不在list列表中的一个字符
* :匹配前面子表达式0次或者多次
\{n\}:匹配前面的子表达式n次
\{n,\}:匹配前面的子表达式不少于n次
\{n,m\}:匹配前面的子表达式n到m次
注:egrep、awk使用{n}、{n,}、{n,m}匹配时“{}”前不用加“\”
egrep -E -n 'wo{2}d' test.txt #-E用于显示文件中符合条件的字符
egrep -E -n 'wo{2,3}d' test.txt
定位符
^匹配输入字符串开始的位置
$匹配输入字符串结尾的位置
非打印字符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
扩展正则表达式(支持的工具:egrep、awk)
通常情况下会使用基础正则表达式就已经足够了,但有时为了简化整个指令,需要使用范围更广的扩展正则表达式。例如,使用基础正则表达式查询除文件中空白行与行首为“#”之外的行,执行“grep -v ‘^KaTeX parse error: Expected group after '^' at position 24: …xt” | grep -v '^̲#' test.txt即可实现… | ^#’ test.txt”,其中,单引号内的管道符号表示或者(or)。
+ 作用:重复一个或一个以上的前一个字符
? 作用:零个或者一个的前一个字符
| 作用:使用或者(or)的方式找出多个字符
() 作用:查找“组”字符串
“egrep -n 't(a|e)st' test.txt”查询tast或test字符串
()+ 作用:辨别多个重复的组
“egrep -n 'A(xyz)+C' test.txt” 查询开头的“A”结尾是“C”,中间有一个以上的“xyz”字符串的意思
元字符操作的案例
(1)查找特定字符
查找特定字符非常简单,如执行以下命令即可从 test.txt 文件中查找出特定字符“the”所在位置。其中“-n”表示显示行号、“-i”表示不区分大小写。命令执行后,符合匹配标准的字符, 字体颜色会变为红色(本章中全部通过加粗显示代替)。
grep -n 'the' test.txt
若反向选择,如查找不包含“the”字符的行,则需要通过 grep 命令的“-v”选项实现,并配合“-n”一起使用显示行号。
grep -vn 'the' test.txt
(2)利用中括号“[]”来查找集合字符
想要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含“sh”与“rt”。此时执行以下命令即可同时查找到“shirt”与“short”这两个字符串,其中“[]”中无论有几个字符, 都仅代表一个字符,也就是说“[io]”表示匹配“i”或者“o”。
grep -n 'sh[io]rt' test.txt
若要查找包含重复单个字符“oo”时,只需要执行以下命令即可。
grep -n 'oo' test.txt
若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[^]”来实现该目的。例如执行“grep -n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo”前面不是“w”的字符串。
grep -n '[^w]oo' test.txt
在上述命令的执行结果中发现“woood”与“wooooood”也符合匹配规则,二者均包含“w”。其实通过执行结果就可以看出,符合匹配标准的字符加粗显示,而上述结果中可以得知, “#woood #”中加粗显示的是“ooo”,而“oo”前面的“o”是符合匹配规则的。同理“#woooooood #”也符合匹配规则。
若不希望“oo”前面存在小写字母,可以使用“grep -n‘[^a-z]oo’test.txt”命令实现,其中
“a-z”表示小写字母,大写字母则通过“A-Z”表示。
grep -n '[^a-z]oo' test.txt
查找包含数字的行可以通过“grep -n ‘[0-9]’test.txt”命令来实现。
grep -n '[0-9]' test.txt
(3)查找行首“^”与行尾字符“$”
基础正则表达式包含两个定位元字符:“^”(行首)与“$”(行尾)。在上面的示例中, 查询“the”字符串时出现了很多包含“the”的行,如果想要查询以“the”字符串为行首的行,则可以通过“^”元字符来实现。
[[email protected] ~]# grep -n '^the' test.txt
查询以小写字母开头的行可以通过“^[a-z]”规则来过滤,查询大写字母开头的行则使用
“^[A-Z]”规则,若查询不以字母开头的行则使用“^[^a-zA-Z]”规则。
[[email protected] ~]# grep -n '^[a-z]' test.txt
“^”符号在元字符集合“[]”符号内外的作用是不一样的,在“[]”符号内表示反向选择,在“[]” 符号外则代表定位行首。反之,若想查找以某一特定字符结尾的行则可以使用“$”定位符。例如,执行以下命令即可实现查询以小数点(.)结尾的行。因为小数点(.)在正则表达式中也是一个元字符(后面会讲到),所以在这里需要用转义字符“\”将具有特殊意义的字符转化成普通字符。
[[email protected] ~]# grep -n '\.$' test.txt
当查询空白行时,执行“grep -n‘^$’test.txt”命令即可。
[[email protected] ~]# grep -n '^$' test.txt
(4)查找任意一个字符 “.“与重复字符”*”
前面提到,在正则表达式中小数点(.)也是一个元字符,代表任意一个字符。例如执行以下命令就可以查找“w??d”的字符串,即共有四个字符,以 w 开头 d 结尾。
[[email protected] ~]# grep -n 'w..d' test.txt
在上述结果中,“wood”字符串“w..d”匹配规则。若想要查询 oo、ooo、ooooo 等资料, 则需要使用星号(*)元字符。但需要注意的是,“*”代表的是重复零个或多个前面的单字符。 “o*”表示拥有零个(即为空字符)或大于等于一个“o”的字符,因为允许空字符,所以执行“grep -n 'o*' test.txt”命令会将文本中所有的内容都输出打印。如果是“oo*”,则第一个 o 必须存在, 第二个 o 则是零个或多个 o,所以凡是包含 o、oo、ooo、ooo,等的资料都符合标准。同理,若查询包含至少两个 o 以上的字符串,则执行“grep -n 'ooo*' test.txt”命令即可。
[[email protected] ~]# grep -n 'ooo*' test.txt
查询以 w 开头 d 结尾,中间包含至少一个 o 的字符串,执行以下命令即可实现。
[[email protected] ~]# grep -n 'woo*d' test.txt
执行以下命令即可查询以 w 开头 d 结尾,中间的字符可有可无的字符串。
[[email protected] ~]# grep -n 'w.*d' test.txt
执行以下命令即可查询任意数字所在行。
[[email protected] ~]# grep -n '[0-9][0-9]*' test.txt
(5)查找连续字符范围“{}”
在上面的示例中,使用了“.”与“*”来设定零个到无限多个重复的字符,如果想要限制一个范围内的重复的字符串该如何实现呢?例如,查找三到五个 o 的连续字符,这个时候就需要使用基础正则表达式中的限定范围的字符“{}”。因为“{}”在 Shell 中具有特殊意义,所以在使用“{}”字符时,需要利用转义字符“\”,将“{}”字符转换成普通字符。“{}”字符的使用方法如下所示。
① 查询两个 o 的字符。
[[email protected] ~]# grep -n 'o\{2\}' test.txt
② 查询以 w 开头以 d 结尾,中间包含 2~5 个 o 的字符串。
[[email protected] ~]# grep -n 'wo\{2,5\}d' test.txt
③ 查询以 w 开头以 d 结尾,中间包含 2 个或 2 个以上 o 的字符串。
[[email protected] ~]# grep -n 'wo\{2,\}d' test.txt
总结:元字符
| ^ | 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配“^” 字符本身,请使用“^” |
|---|---|
| $ | 匹配输入字符串的结尾位置。如果设置了RegExp 对象的 Multiline 属性,则“KaTeX parse error: Undefined control sequence: \n at position 6: ”也匹配‘\̲n̲’或‘\r’。要匹配“”字符本身,请使用“$” |
| . | 匹配除“\r\n”之外的任何单个字符 |
| \ | 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义 |
| * | 匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“*” |
| [] | 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a” |
| [^] | 赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plin”中任何一个字母 |
| [n1-n2] | 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意一个小写字母字符。 注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示字符的范围;如果出现在字符组的开头,则只能表示连字符本身 |
| {n} | n 是一个非负整数,匹配确定的 n 次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的“oo” |
| {n,} | n 是一个非负整数,至少匹配 n 次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*” |
| {n,m} | m 和 n 均为非负整数,其中 n<=m,最少匹配 n 次且最多匹配m 次 |
边栏推荐
- Unity screenshot widget
- markdown
- 1. Mode
- 【unity】Unity界面scene视图[1]
- 3. Boxing champion Ali
- markdown
- Navicat operation database 2 (micro advanced)
- Jenkins -- Basic -- 5.2 -- system configuration -- system configuration
- Next generation Internet: Video Networking
- Are you ready for the Internet of things to revolutionize manufacturing?
猜你喜欢

Six ways for the Internet of things to improve our lives

c语言实现三子棋游戏

Li Kou brushes 300 record posts
![[untitled]](/img/9e/ccb630a699846de3d99bb7407b2d44.jpg)
[untitled]

Jenkins--基础--02--安装

c语言实现动态顺序表的增删查改

ESP8266接入云平台------DNS 域名连接服务器

The MySQL character set is set to UTF-8, but the console still has the problem of Chinese garbled code

C language to realize mine sweeping game:

Unity twitter login access
随机推荐
十六、awk
Finding the greatest common divisor
Unity twitter login access
Some simple extension methods commonly used by unity
Database interim (I)
Doris or starrocks JMeter pressure measurement
Next generation Internet: Video Networking
Esp8266 access to cloud platform ----- DNS domain name connection server
Come and help you understand the Internet of things in three minutes
MySQL字符集设置为UTF-8,但控制台仍然出现中文乱码问题
Scoring system based on 485 bus
07 - setup and attack of log server
05 - attack and defense of phishing websites
1. Mode
Unity ugui text text box adaptation
7. Formula F1 champion
[unity] unity interface scene view [1]
ESP8266 AP_ UDP_ Server
Unity UGUI Text文本框自适应
c语言实现扫雷游戏: