正则表达式
正则表达式RE
重要的文本处理工具:vim、sed、awk、grep
什么是正则表达式?
正则表达式(regular expression,RE)是一种字符模式,用于查找过程中匹配指定的字符。
在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[oO]ve/ 就是由正斜杠界定的正则表达式,
它将匹配被查找的行中任何位置出现的相同模型。在正则表达式中,元字符是最重要的概念。
匹配数字: ^[0-9]+$ 匹配以[0-9]范围中数字开头 “+”:前面的对象出现一次到多次 $以什么结尾。 123 456 4y5
匹配Mail: [a-z0-9_]+@[a_z0-9]+\.[a-z]+ nanruosen@126.com
是指数字或者字母或者_ 这些字符
匹配IP: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 0-9出现一到三次
或
[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}
digit 英 [ˈdɪdʒɪt] 数字; (从 0 到 9 的任何一个)数位; [man grep]
num1=123
[[ "$num1" =~ ^[[:digit:]]+$ ]] && echo "number" || echo "error"
元字符
定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义
shell元字符(也称为通配符)。由shell来解析,如rm -rf *.pdf , 元字符 * Shell将其解析为任意多个字符
正则表达式元字符 由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、awk、python
# *匹配所有以pdf结尾文件
rm -rf *.pdf
# *前面的字符出现0次到多次
grep 'c*' /etc/passwd
# +号至少需要出现一次
grep 'c\+' /etc/passwd
egrep 'c+' /etc/passwd # +号是扩展元字符
# vim示例
% 全文
1,$ 第一行到最后一行
\< \> 词首和词尾的限制,可以出现符号,不能出现字母
Tom、anatomy、tomatoes及tomorrow
:1,$ s/\<[tT]om/TOM/g
:%s/\<[tT]om\>/TOM/g
正则表达式元字符
基本正则表达式元字符
元字符 | 功能 | 示例 |
^ | 行首定位符 | ^root |
$ | 行尾定位符 | root$ |
. | 匹配单个字符 | r..t |
* | 匹配前导符0到多次 | ro*t |
.* | 任意多个字符 | |
[] | 匹配指定范围内的一个字符 | [Rr]oot |
[ - ] | 匹配指定范围内的一个字符 | [a-z0-9]root |
[^ ] | 匹配不在指定组内的字符 | [^a-z]root |
\ | 用来转义元字符 | root\. |
\< | 词首定位符 | \<root |
\> | 词尾定位符 | root\> |
\(..\) | 匹配稍后使用的字符的标签 |
:%s/192.168.128.200/192.168.128.300/ :%s#\(192.168.128.\)200#\1300# :%s/\(192.\)\(168.\)\(128.\)200/\1\2\3300/ :16,19 s/\(.*\)/#\1/ #注释对应行 |
x\{m\} | 字符x重复出现m次 | o\{5\} |
x\{m,\} | 字符x重复出现m次以上 | o\{5,\} |
x\{m,n\} | 字符x重复出现m到n次 | o\{5,10\} |
扩展正则匹配元字符
元字符 | 功能 | 示例 |
+ | 匹配一个或多个前导字符 | ro+t |
? | 匹配零个或一个前导字符 | ro?t |
a|b | 匹配a或b | root|nan |
() | 组字符 | root|nan cn(blo|nan)gs+ gs+ (gs)+ |
(...)(...)\1\2 | 标签匹配字符 | (192.168.128.)200\1300 |
x{m} | 字符x重复m次 | o{5} |
x{m,} | 字符x重复至少m次 | o{5,} |
x{m,n} | 字符x重复m到n次 | o{5,10} |
POSIX字符类
表达式 | 功能 | 示例 |
[:alnum:] | 字母与数字字符 | [[:alnum:]]+ |
[:alpha:] | 字母字符(包括大小写字母) | [[:alpha:]]{4} |
[:blank:] | 空格与制表符 | [[:blank:]]* |
[:digit:] | 数字字母 | [[:digit:]]? |
[:lower:] | 小写字母 | [[:lower:]]{5,} |
[:upper:] | 大写字母 | [[:upper:]]+ |
[:punct:] | 标点符号 | [[:punct:]] |
[:space:] | 包括换行符,回车等在内的所有空白 | [[:space:]]+ |
正则匹配示例 vim
/love/
/^love/
/love$/
/l.ve/
/lo*ve/
/[Ll]ove/
/love[a-z]/
/love[^a-zA-Z0-9]/
/.*/ 整行
/^$/ 空行
/^[A-Z]..$/
/^[A-Z][a-z]*5[0-3]/
/[a-z]*\./
/^ * [A-Z][a-z][a-z]$/
/^[A-z]*[^,][A-z]*$/
/\<fourth\>/
/\<f.*rth\>/
/5{2}3{2}\./
空行
/^$/
/^[ \t]*$/
注释行
/^#/
/^[ \t]*#/
:1,$ s/\([Oo]ccur\)ence/\1rence/
:1,$ s/\(square\) and \(fair\)/\2 and \1/