正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。
正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
支持正则表达式的程序如:locate |find| vim| grep| sed |awk
元字符
指那些在正则表达式中具有特殊意义的专用字符,如:点(.) 星(*) 问号(?)等
前导字符
位于元字符前面的字符. abc* aooo.
元字符 | 功能 | 备注 |
---|---|---|
. | 匹配除了换行符以外的任意单个字符 | |
* | 前导字符出现0次或连续多次 | |
.* | 任意长度字符 | ab.* |
^ | 行首(以...开头) | ^root |
$ | 行尾(以...结尾) | bash$ |
^$ | 空行 | |
[] | 匹配括号里任意单个字符或一组单个字符 | [abc] |
[^] | 匹配不包含括号里任一单个字符或一组单个字符 | [^abc] |
[1] | 匹配以括号里任意单个字符或一组单个字符开头 | [2] |
^[^] | 匹配不以括号里任意单个字符或一组单个字符开头 | ^[^abc] |
# cat 1.txt ggle gogle google gooogle goooooogle gooooooogle taobao.com taotaobaobao.com jingdong.com dingdingdongdong.com 10.1.1.1 Adfjd8789JHfdsdf/ a87fdjfkdLKJK 7kdjfd989KJK; bSKJjkksdjf878. cidufKJHJ6576, hello world helloworld yourself
元字符 | 功能 | 备注 |
---|---|---|
\< | 取单词的头 | |
\> | 取单词的尾 | |
\< \> | 精确匹配 | |
\{n\} | 匹配前导字符连续出现n次 | |
\{n,\} | 匹配前导字符至少出现n次 | |
\{n,m\} | 匹配前导字符出现n次与m次之间 | |
\( \) | 保存被匹配的字符 | |
\d | 匹配数字(grep -P) | [0-9] |
\w | 匹配字母数字下划线(grep -P) | [a-zA-Z0-9_] |
\s | 匹配空格、制表符、换页符(grep -P) | [\t\r\n] |
举例说明:
需求:将10.1.1.1替换成10.1.1.254 1)vim编辑器支持正则表达式 # vim 1.txt :%s#\(10.1.1\).1#\1.254#g :%s/\(10.1.1\).1/\1.254/g 2)sed支持正则表达式【后面学】 # sed -n 's#\(10.1.1\).1#\1.254#p' 1.txt 10.1.1.254 说明: 找出含有10.1.1的行,同时保留10.1.1并标记为标签1,之后可以使用\1来引用它。 最多可以定义9个标签,从左边开始编号,最左边的是第一个。 需求:将helloworld yourself 换成hellolilei myself # vim 1.txt :%s#\(hello\)world your\(self\)#\1lilei my\2#g # sed -n 's/\(hello\)world your\(self\)/\1lilei my\2/p' 1.txt hellolilei myself # sed -n 's/helloworld yourself/hellolilei myself/p' 1.txt hellolilei myself # sed -n 's/\(hello\)world your\(self\)/\1lilei my\2/p' 1.txt hellolilei myself Perl内置正则: \d 匹配数字 [0-9] \w 匹配字母数字下划线[a-zA-Z0-9_] \s 匹配空格、制表符、换页符[\t\r\n] # grep -P '\d' 1.txt # grep -P '\w' 2.txt # grep -P '\s' 3.txt
丑话说在前面:
我说我比较特殊,你要相信!否则我错给你看