[华为云在线课程][Linux文本处理工具和正则表达式][第四章基本和扩展正则表达式][学习笔记]

举报
John2021 发表于 2022/04/12 16:14:14 2022/04/12
【摘要】 REGEXP:Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。正则表达式被很多程序和开发语言所广泛支持:vim,less,grep,sed,awk,nginx,mysql等等。正则表达式分两类:...

REGEXP:Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
正则表达式被很多程序和开发语言所广泛支持:vim,less,grep,sed,awk,nginx,mysql等等。
正则表达式分两类:

  • 基本正则表达式:BRE,Basic Regular Expressions
  • 扩展正则表达式:ERE,Extended Regular Expressions

正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块,如:PCRE(Perl Compatible Regular Expressions)
正则表达式的元字符分类:字符匹配,匹配次数,位置锚定,分组
帮助:man 7 regex

基本正则表达式元字符

字符匹配

.               匹配任意某个字符,可以是一个汉字
[]              匹配指定范围内的任意单个字符,示例:[hello] [0-9] [a-z] [a-zA-Z]
[^]             匹配指定范围外的任意单个字符,示例:[^hello]
[:alnum:]       字母和数字
[:alpha:]       代表任何英文大小写字符,例如:a-z A-Z
[:lower:]       小写字母,例如:[[:lower:]]相当于[a-z]
[:upper:]       大写字母,例如:[[:upper:]]相当于[A-Z]
[:blank:]       空白字符(空格和制表符)
[:space:]       水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:]       不可打印的控制字符(退格,删除,警铃...[:digit:]       十进制数字
[:xdigit:]      十六进制数字
[:graph:]       可打印的非空白字符
[:print:]       可打印字符
[:punct:]       标点符号

例子:

rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[root@localhost ~]# ls /etc/ | grep "rc[.0-6]"
rc0
rc1
rc2
rc3
rc4
rc5
rc6
rc.
rc.
[root@localhost Code]# ls /etc/ | grep 'rc[.0-6].'
rc0.
rc1.
rc2.
rc3.
rc4.
rc5.
rc6.
rc.d
rc.l
[root@localhost Code]# ls /etc/ | grep 'rc[.0-6]\.'
rc0.
rc1.
rc2.
rc3.
rc4.
rc5.
rc6.

匹配次数

用在要指定次数的字符后面,用于指定前面的字符要出现的次数

*           匹配前面的字符任意次,包括0次,贪婪模式,尽可能长的匹配
.*          任意长度的任意字符
\?          匹配其前面的字符01次,即:可有可无
\+          匹配其前面的字符至少1次,即:肯定有,>=1
\{n\}       匹配前面的字符n次
\{m,n\}     匹配前面的字符至少m次,至多n次
\{,n\}      匹配前面的字符至多n次,<=n
\{n,\}      匹配前面的字符至少n次

例子:

[root@localhost Code]# echo /etc/ | grep "/etc/\?"
/etc/
[root@localhost Code]# echo /etc | grep "/etc/\?"
/etc

例子:

[root@localhost Code]# cat test.txt
google
goooooooooooooooooooooogle
ggle
goooOOOOO00000gle
goooogle
[root@localhost Code]# grep "go\{2,\}gle" test.txt
google
goooooooooooooooooooooogle
goooogle
[root@localhost Code]# grep "goo\+gle" test.txt
google
goooooooooooooooooooooogle
goooogle
[root@localhost Code]# grep "goo*gle" test.txt
google
goooooooooooooooooooooogle
goooogle
[root@localhost Code]# grep "gooooo*gle" test.txt
goooooooooooooooooooooogle
goooogle
[root@localhost Code]# grep "gooo*gle" test.txt
google
goooooooooooooooooooooogle
goooogle

例子:匹配正负数

[root@localhost Code]# echo -1 -2 123 -123 234 | grep "-\?"
grep: invalid option -- '\'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

[root@localhost Code]# echo -1 -2 123 -123 234 | grep "\-\?[0-9]\+"
-1 -2 123 -123 234
[root@localhost Code]# echo -1 -2 123 -123 234 | grep -E "-?[0-9]+"
grep: invalid option -- '?'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
[root@localhost Code]# echo -1 -2 123 -123 234 | grep -E "\-?[0-9]+"
-1 -2 123 -123 234
[root@localhost Code]# echo -1 -2 123 -123 234 | grep -E -- "-?[0-9]+"
-1 -2 123 -123 234
[root@localhost Code]# echo -1 -2 123 -123 234 | grep -E  "(-)?[0-9]+"
-1 -2 123 -123 234

例子:获取IP地址

[root@localhost ~]# ifconfig ens33|grep netmask |grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|head -n1
10.0.0.110
[root@localhost ~]# ifconfig ens33|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|head -n1
10.0.0.110

位置锚定

位置锚定可以用于定位出现的位置

^               用于模式的最左侧
$               行尾锚定,用于模式的最右侧
^PATTERN$       用于模式匹配整行
^$              空行
^[[:space:]]*$  空白行
\<或\b          词首锚定,用于单词模式的左侧
\>或\b          词尾锚定,用于单词模式的右侧
\<PATTERN\>     匹配整个单词
注意:单词是由字母,数字,下划线组成

例子:排除掉空行和#开头的行

[root@localhost ~]# grep -v '^$' /etc/profile|grep -v '^#'
[root@localhost ~]# grep -v '^$' /etc/profile

分组其他

分组

分组:()将多个字符捆绑在一起,当做一个整体处理,如:\(root\)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,...\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
例子:

\(string1\(string2\)\)
\1:string1\(string2\)
\2:string2

注意:后向引用引用前面的分组括号中的模式所匹配字符,而非模式本身

或者

或者:\|
例子:

a\|b        a或者b
C\|cat      C或者cat
\(C|\c\)at  Cat或cat

例子:排除空行和#开头的行

[root@localhost ~]# grep "^[^#]" /etc/httpd/conf/httpd.conf
[root@localhost ~]# grep -v '^\(#\|$\)' /etc/httpd/conf/httpd.conf
[root@localhost ~]# grep -v '^#\|^$' /etc/httpd/conf/httpd.conf
[root@localhost ~]# grep -v '^#' /etc/httpd/conf/httpd.conf | grep -v ^$

拓展正则表达式

字符匹配元字符

.           任意单个字符
[hello]     指定范围的字符
[^hello]    不在指定范围的字符
[:alnum:]   字母和数字
[:alpha:]   代表任何英文大小写字符,例如A-Z,a-z
[:lower:]   小写字母,例如:[[:lower:]],相当于[a-z]
[:upper:]   大写字母
[:blank:]   空白字符(空格和制表符)
[:space:]   水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:]   不可打印的控制字符(退格、删除、警铃等)
[:digit:]   十进制数字
[:xdigit:]  十六进制数字
[:graph:]   可打印的非空白字符
[:print:]   可打印字符
[:punct:]   标点符号

次数匹配

*           匹配前面字符任意次
?           01+           1次或多次
{n}         匹配n次
{m,n}       至少m,至多n次

位置锚定

^           行首
$           行尾
|<,\b       词首
|>,\b       词尾

分组其他

()          分组
后向引用:\1,\2,...
|           或者
a|b         a或b
C|cat       C或cat
(C|c)at     Cat或cat
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。