linux之正则表达式

1、定义
正则表达式是使用一种模式去匹配一类字符串的公式;


2、元字符

使用vi命令新建文本文件,用于测试,文件内容如下:

rot
@123
rat
good
god
gooood
gd
Good
1djsdh
_test1212
020-7266452
010 6765276
0987-8726531
13687652890
78731

dhsdsjhd
hello world good
teast good
Good morning

1)点号.

匹配除换行符外的任意一个字符

#匹配rot、rat所在的行
cat
RegText.sh|grep 'r.t'

执行结果:

rot
rat

2)星号*
匹配*号前一个字符0次或多次
#匹配god、good等字符所在的行
cat RegText.sh|grep 'go*d'  

  执行结果:

  good
  god
  gooood
  gd
  hello world good
  teast good

3)\{n,\m}

匹配前一个字符出现n-m次,m为空表示前一个字符出现≥n
#匹配god,o出现大于2次所在的行
cat
RegText.sh|grep 'go\{2,\}d'

执行结果:

good
gooood
hello world good
teast good

 

4)^符号

匹配以该字符串开头的字符串

#匹配以good开头所在的行
cat
RegText.sh|grep '^good'

执行结果:

good
good morning

  • 增加-i忽略大小写
cat RegText.sh|grep -i '^good'

执行结果:

good
Good
good morning

  • 增加-v反选
#匹配非good开头所在的行
cat
RegText.sh|grep -v '^good'

执行结果:

rot
rat
god

...(省略)

  • 增加-c统计匹配的行数
#匹配以good开头的行数
cat RegText|grep -c '^good'

执行结果:

2

 

5)$符号

匹配以该字符串结尾所在的行

#匹配以good结尾所在的行
cat RegText.sh|grep 'good$'

执行结果:

good
hello world good
teast good

 

6)[]双括号

匹配括号内的任意字符出现的行;

#手机号码匹配,以1开头,[0-9]数字,11位;
cat RegText.sh|grep '^1[0-9]\{10\}'

执行结果:

13687652890

 

7)转义字符 \

用于转义特殊的符号,例如.*{}\-空格等;

#匹配座机号码,区号为3位或四位数字、连接符为空格或-、号码为7位数字
cat RegText.sh|grep '[0-9]\{3,4\}[\ \-][0-9]\{7\}'

执行结果:

020-7266452
010 6765276
0987-8726531

 

8)\d
匹配任意数字,相当于[0-9]

\d是一种perl兼容模式,使用这种模式匹配,需要加上-P参数

#匹配以数字开头所在的行
cat RegText.sh|grep -P '^\d' 

执行结果:

1djsdh
020-7266452
010 6765276
0987-8726531
13687652890
78731

 

9)\w
匹配任意数字、字母和下划线,相当于[0-9a-zA-Z]
\w是一种perl兼容模式,使用这种模式匹配,需要加上-P参数

#匹配以数字、字母和下划线开头所在的行
cat RegText.sh|grep -P '^\w'

执行结果:

rot
rat
good
god
gooood
gd
Good
1djsdh
_test1212
020-7266452
010 6765276
0987-8726531
13687652890

...(省略)

 

10)\W
匹配任意非数字、字母和下划线,相当于[^0-9A-Za-z]
\W是一种perl兼容模式,使用这种模式匹配,需要加上-P参数

#匹配以非数字、字母和下划线开头所在的行
cat RegText.sh|grep -P '^\W'

执行结果:

@123

 

11)\b
匹配单词的边界,常用于精确单词的匹配;相当于\<单词\>

#精确搜索good所在的行
cat RegText.sh|grep '\bgood\b' 
cat test.sh |grep '\<good\>'

执行结果:

good
hello world good
teast good
good morning

 

扩展的正则表达式,过滤需要使用egrep
1)?
匹配前面一个字符出现0次或1次,过滤需要使用egrep

#匹配god,o出现0次或1次
cat RegText.sh|egrep 'go?d'执行结果:

执行结果:

god
gd

 

2)+

匹配前一个字符出现1次或多次,需要使用egrep,相当于\{1,\}

#匹配god、good等o出现1次或多次所在的行
cat RegText.sh|egrep 'go+d'
cat RegText.sh|grep 'go\{1,\}d'

执行结果:

good
god
gooood
hello world good
teast good
good morning

 

3)()小括号

小括号和|符号一起使用,用于匹配可替换的字符,相当于[]

#匹配rot或rat所在的行
cat RegText.sh|egrep 'r(o|a)t'
cat RegText.sh|grep 'r[oa]t'

执行结果:

rot
rat


posted @ 2020-03-14 16:44  雨后的太阳  阅读(348)  评论(0编辑  收藏  举报