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