Shell编程5_正则表达式

目录

一、正则表达式的分类

1.基本正则表达式:

2.扩展正则表达式:

3.POSIX 字符:

4.特殊字符:

二、正则表达式的使用示例

1、字符匹配

(1).: 匹配任意单个字符

(2)[] : 匹配指定中括号范围内的任意单个字符

2、次数匹配

(1)*: 匹配前面的字符任意次(0 次或无数次)

(2)\?: 匹配前面的字符 0 次或 1 次

(3)+: 匹配前面的字符至少 1 次

(4)\{m\,}: 匹配前面的字符至少 m 次

(5)\{,n}: 匹配前面的字符最多 n 次——问题

(6)\{m,n\}: 匹配前面的字符至少 m 次,至多 n 次

(7).*: 匹配任意字符任意次数

3、位置锚定

(1)^: 行首锚定,用于模式最左边

(2)$: 行尾锚定,用于模式最右边

(3)\< 或 \b: 锚定词首,用于单词模式左侧

(4)\> 或 \b: 锚定词尾,用于单词模式右侧

4、分组引用


一、正则表达式的分类

1.基本正则表达式:

Basic Regular Expression 又叫 Basic RegEx 简称 BREs,在基本正则表达式中作用的元字符为:^ 、$、 . 、[] 、* ;

2.扩展正则表达式:

Extended Regular Expression 又叫 Extended RegEx 简称 EREs,其为在基本正则表达式上新增了 () 、{ 、} 、?、 + 、等元字符,使得正则表达式更加简洁易用。

3.POSIX 字符:

通用 POSIX 原字符如下:

[:alnum:] 字母数字[a-z A-Z 0-9]
[:alpha:] 字母[a-z A-Z]
[:blank:] 空格或制表键
[:cntrl:] 任何控制字符
[:digit:] 数字 [0-9]
[:graph:] 任何可视字符(无空格)
[:lower:] 小写 [a-z]
[:print:] 非控制字符	
[:punct:] 标点字符
[:space:] 空格
[:upper:] 大写 [A-Z]
[:xdigit:] 十六进制数字 [0-9 a-f A-F]

4.特殊字符:

在扩展正则表达式中加上 \ 则被认为其具有特殊含义:

\w 匹配任意数字和字母,等效[a-zA-Z0-9_]
\W 和\w相反,等效[^a-zA-Z0-9_]
\b 匹配字符串开始或结束,等效\<和\>
\s 匹配任意的空白字符
\S 匹配非空白字符

二、正则表达式的使用示例

1、字符匹配

(1).: 匹配任意单个字符

[root@master reg]# cat test.txt 
she
sh
s1e
[root@master reg]# grep "s.e" test.txt 
she
s1e

(2)[] : 匹配指定中括号范围内的任意单个字符

[root@master reg]# cat test.txt 
she
sh
s1e
[root@master reg]# grep "s[a-z]e" test.txt 
she
[root@master reg]# grep "s[1-9]e" test.txt    
s1e
[root@master reg]# grep "s[[:alnum:]]e" test.txt      // 匹配字符或数字  
she
s1e
[root@master reg]# grep "s[[:alpha:]]e" test.txt    
she
[root@master reg]# grep "s[[:digit:]]e" test.txt      
s1e

中括号内可以利用元字符来表示。如下,匹配的元字符"^"取反,也就是不包含匹配的内容。

[root@master reg]# cat test.txt 
she
sh
s1e
[root@master reg]# grep "s[^[:digit:]]e" test.txt    
she
[root@master reg]# grep "s[^a-z]e" test.txt          
s1e

2、次数匹配

次数匹配用在指定的字符后面,表示指定匹配到前面的字符出现多少次。

(1)*: 匹配前面的字符任意次(0 次或无数次)

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "s*" test2.txt 
ssssh
sheee
hell  // 匹配到0次也会查出来

(2)\?: 匹配前面的字符 0 次或 1 次

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "s\?" test2.txt 
ssssh						
sheee						
[root@master reg]# grep -E "s?" test2.txt  
ssssh
sheee

如上匹配 s 可以存在 0 次,或者存在 1 次之后需要有 h 字符,注意利用选项 -E 开启扩展正则表达式,相较于基本正则表达式不需要 \

(3)+: 匹配前面的字符至少 1 次

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "s\+h" test2.txt  
ssssh						# 匹配ssssh
sheee						# 匹配sh
[root@master reg]# grep -E "s+h" test2.txt
ssssh
sheee

(4)\{m\,}: 匹配前面的字符至少 m 次

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "s\{1,\}" test2.txt 
ssssh
sheee
[root@master reg]# grep -E "s{1,}" test2.txt   
ssssh
sheee
[root@master reg]# grep "s\{2,\}" test2.txt  
ssssh
[root@master reg]# grep -E "s{2,}" test2.txt   
ssssh

(5)\{,n}: 匹配前面的字符最多 n 次——问题

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "s\{,2\}" test2.txt     
ssssh
sheee
hell
[root@master reg]# grep -E "s{,2}" test2.txt  
ssssh
sheee
hell

注:本次测试中,筛选结果并没有达到预期效果,本意是最多为2次筛选到结果,但实际上第3次匹配的结果也能查出来。

(6)\{m,n\}: 匹配前面的字符至少 m 次,至多 n 次

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "s\{1,2\}" test2.txt    
ssssh
sheee
[root@master reg]# grep -E "s{1,2}" test2.txt 
ssssh
sheee

(7).*: 匹配任意字符任意次数

3、位置锚定

(1)^: 行首锚定,用于模式最左边

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "^s" test2.txt 
ssssh
sheee

(2)$: 行尾锚定,用于模式最右边

[root@master reg]# cat test2.txt 
ssssh
sheee
hell
[root@master reg]# grep "h$" test2.txt 
ssssh

(3)\< 或 \b: 锚定词首,用于单词模式左侧

[root@master reg]# cat test2.txt 
go root user
root:shell;gousers
hellorootgouser
[root@master reg]# grep "\

(4)\> 或 \b: 锚定词尾,用于单词模式右侧

[root@master reg]# grep "gouser\b" test2.txt 
hellorootgouser
[root@master reg]# grep "gouser\>" test2.txt  
hellorootgouser

4、分组引用

  • () 分组:将一个或多个字符当成一个整体来进行后续处理;
  • 1…数字引用:从左侧起,引用第一个左括号以及与之匹配右括号之间的模式所匹配到的字符,后向引用,例如
grep -E "(root).*\1" /etc/passwd

利用 () 将 root 引用起来,后面利用数字 1 引用。

你可能感兴趣的:(Linux)