正则表达式是什么
字符模式 缩写RE
用于查找过程中匹配指定字符
许多程序设计语言都支持正则表达式进行字符串操作
正则表达式概念最初由Unix中的工具软件普及开的,如sed grep
支持正则表达式的程序如:locate find vim grep sed awk
正则可以干什么
匹配邮箱 匹配身份证号码 手机号 银行卡
匹配某些特定字符串 做特定处理
正则中的名词解释
- 元字符
指那些正则表达式中具有特俗意义的专用字符 如点. 星* 问号? 等 - 前导字符
位于元字符前面的一个字符 abc
* aoo
.
第一类正则表达式
- 普通常用元字符
. 匹配除了换行符以外的任意单个字符
* 前导字符出现0次或者连续多次
.* 任意长度字符
^ 行首 以..开头
$ 行尾 以..结尾
^$ 空行
[] 匹配括号里任意单个字符或一组单个字符
[^] 匹配不包含括号内任一单个字符或者一组单个字符
^[] 匹配以括号里任意单个字符或一组单个字符开头
^[^] 匹配不以括号里任意单个字符或一组单个字符开头
################################################
grep 'g.' 1.txt
匹配包含g和后所跟任意单个字符的行 (grep 行过滤)
grep 'go*' 1.txt
匹配g和o0个或多个的行
grep 'go.*' 1.txt
匹配go和后面任意长度字符的行
grep '^gel' 1.txt
匹配以gel开头的行
grep 'abc$' 1.txt
匹配以abc结尾的行
grep '^[abc]' 1.txt
匹配以a或b或c开头的
grep '^[abc]' 1.txt
匹配不以a或b或c开头的
- 其他常用元字符
\< 取单词的头
\> 取单词的尾
\<\> 精确匹配
\{n\} 匹配前导字符连续出现n次
\{n,\} 匹配前导字符至少出现n次
\{n,m\} 匹配前导字符出现n次与m次之间
\(\) 保存被匹配的字符
\d 匹配数字 grep -P 要加P [0-9]
\w 匹配字母数字下划线 grep -P 要加P [a-zA-Z0-9_]
\s 匹配空格 制表符 换页符 grep -P 要加P [\t\r\n]
##############################################
grep '\<hel' 1.txt
匹配里面单词以hel为头
grep 'rld\>' 1.txt
匹配里面单词以rld为尾
#匹配内容里单词的头或尾 不是单词不匹配
grep '\<hello\>' 1.txt
精确匹配hello这个单词 注意是单词
grep -w hello 1.txt 和这个精确匹配差不多
grep 'go\{2\}' 1.txt
匹配g和前导字符o连续出现2次的
grep 'go\{2,\}' 1.txt
匹配g和前导字符o至少出现2次
grep 'go\{2,4\}' 1.txt
匹配g和前导字符o出现2-4次
grep '[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{1\}\.[0-9]\{1\}' 1.txt
匹配ip 192.168.0.1 [0-9]表示数字 3 3 1 1 出现次数 \. 转义.
vim
:%S/10.10.1.1/10.10.1.2/g
:%s/\(10.10.1\).1/\1.254/g
:%s/helloworld yourself/hiworld myself/g
:%s/hello\(world \)your\(self\)/hi\1my\2/g
只替换掉不同的部分
- 扩展类正则常用字符
比较特殊 比如
grep
要用到 要加-E
或者用egrep
sed
要用的话 必须加-r
+ 匹配一个或多个前导字符 grep -E bo+ 匹配boo,bo
? 匹配零个或一个前导字符 grep -E bo? 匹配b,bo
| 或 grep -E a|b
() 组字符 看成整体 grep -E (my|your)self 匹配myself或yourself
{n} 前导字符重复n次
{n,} 前导字符重复至少n次
{n,m} 前导字符重复n到m次
第二类正则
[:alnum:] 字母与数字字符 [[:alunm:]]+
[:alpha:] 字符字符(包括大小写) [[:alpha:]]{4}
[:blank:] 空格与制表符 [[:blank:]]*
[:digit:] 数字 [[:digit:]]?
[:lower:] 小写字母 [[:lower:]]{4,}
[:upper:] 大写字母 [[:upper:]]+ [A-Z]
[:punct:] 标点符号 [[:punct:]]
[:space:] 包括换行符,回车在内的所有空白 [[:space:]]+
grep -E [[:alunm:]]+
正则表达式总结
- 1.我要找什么
找数字 [0-9]
找字母 [a-zA-Z]
找标点符号 [[:punct:]]
- 2.我要如何找
以什么为首 ^key
以什么为结尾 key$
包含什么或者不包含什么 [abc] ^[abc][^abc]^[^abc]
- 3.我要找多少
找前导字符出现0次或连续多次 ab*
找任意单个字符 ab.
找任意字符 ab.*
找前导字符连续出现几次 {n} {n,} {n,m}
找前导字符出现1次或者多次 go+
1.1.1.1
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}
([0-9]{1,3}\.){3}[0-9]{1,3}
\d+\.\d+\.\d+\.\d+
(\d+\.){3}\d+
案例
1.查找不以大写字母开头的行
grep '^[^A-Z]'
grep -v '^[A-Z]'
grep '^[^[:upper:]]'
2.查找所有数字的行
grep [0-9]
grep -P '\d'
3.查找一个数字和在一个字母连起来
grep -E '[0-9][a-zA-Z]|[a-zA-Z][0-9]'
4.查找不以r开头的行
grep -v '^r'
5.查找以数字开头的行
grep '^[0-9]'
6.查找以大写字母开头的
grep '^[A-Z]'
7.查找以小写字母开头的
grep '^[a-z]'
8.查找以点结束的
grep '\.$'
9.去掉空行
grep -v '^$'
10.查找完全匹配abc的行
grep '\<abc\>'
grep -w 'abc'
11.查找A后面有3个数字的行
grep 'A[0-9]{3}'
12.统计root在/etc/passwd出现几次 -o 只显示匹配项
grep -o 'root' /etc/passwd | wc -l
13.用正则找出自己的ip地址 广播地址 子网掩码
ifconfig|grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}'
14.找出文件中的ip地址并且打印替换为172.16.2.254
grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt | sed -n 's/192.168.0.\(254\)/172.16.2.\1/p'
15.找出文件中的ip地址
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt
16.找出全部是数字的行
grep -E '^[0-9]+$'
17.找出邮箱地址
grep -E '^[0-9a-zA-Z]+@[a-z0-9]+\.[a-z]+$'