一、正则表达式简介1、什么是正则表达式?正则表达式是用于描述字符排列和匹配模式的语法规则。主要用于字符串的模式拆分、匹配、查找和替换操作。2、正则表达式和通配符/正则表达式通配符匹配主文件中的内容。文件名匹配规则包括匹配和完全匹配常用命令grep、awk、sedls、find、cp3。通配符*:匹配任意0到多个字符?:匹配任意字符[]:匹配括号中的一个字符*匹配任意0到多个字符目录下有5个文件,1个子目录[root/tmp/tmp]#ll总使用量0-rw-r--r--1rootroot0May3103:37abc.ini-rw-r--r--1rootroot0May3103:37a.conf-rw-r--r--1rootroot0May3103:37a.md-rw-r--r--1rootroot0May3103:37bbb.md-rw-r--r--1rootroot0May3103:37bc.inidrwxr-xr-x2rootroot58May3103:39sh/列出目录下的所有文件,包括子目录下的文件[root/tmp/tmp]#ll*-rw-r--r--1rootroot0May3103:37abc.ini-rw-r--r--1rootroot0May3103:37a.conf-rw-r--r--1rootroot055月31日03:37a.md-rw-r--r--1rootroot0May3103:37bbb.md-rw-r--r--1rootroot05月31日03:37bc.inish:总使用量0-rw-r--r--1rootroot0May3103:39asd.sh-rw-r--r--1rootroot0May3103:38qwe.sh-rw-r--r--1rootroot0May3103:39rty.sh-rw-r--r--1rootroot0May3103:39zxc.sh列出a和以sh[root/tmp/tmp]#lla*-rw-r--r--1rootroot05月31日03:37abc.ini-rw-r--r--1rootroot0May3103:37a.conf-rw-r--r--1rootroot0May3103:37a.md[root/tmp/tmp]#llsh*totalusage0-rw-r--r--1rootroot0May3103:39asd.sh-rw-r--r--1rootroot0May3103:38qwe.sh-rw-r--r--1rootroot0May3103:39rty.sh-rw-r--r--1rootroot0May3103:39zxc.sh因为通配符是精确的匹配,a*c无法匹配文件,必须使用a*c*[root/tmp/tmp]#lla*cls:cannotaccessa*b:nosuchfileordirectory[root/tmp/tmp]#lla*c*-rw-r--r--1rootroot0May3103:37abc.ini-rw-r--r--1rootroot0May3103:37a.conf匹配目录中的文件[root/tmp/tmp]#lls*a*ls:cannotaccesss*a*:Nosuchfileordirectory[root/tmp/tmp]#lls*/a*-rw-r--r--1rootroot0May3103:39sh/asd.sh?匹配任意字符[root/tmp/tmp]#lltotalusage0-rw-r--r--1rootroot0May3103:59aaa.ini-rw-r--r--1rootroot0May3103:37aaa.md-rw-r--r--1rootroot0May3103:37abc.ini-rw-r--r--1rootroot0May3103:37bbb.md-rw-r--r--1rootroot0May3103:37cbc.inidrwxr-xr-x2rootroot58May3103:39sh/[root/tmp/tmp]#find.-name'?bc.ini'./abc.ini./cbc.ini[root/tmp/tmp]#找到.-name'???.md'./bbb.md./aaa.md[root/tmp/tmp]#找到.-名字'a??.ini'./abc.ini./aaa.ini[root/tmp/tmp]#找到.-name's?'./sh[]匹配括号中的一个字符[root/tmp/tmp]#llTotalusage0-rw-r--r--1rootroot0May3103:59aaa.ini-rw-r--r--1rootroot0May3103:37aaa.md-rw-r--r--1rootroot0May3103:37abc.ini-rw-r--r--1rootroot0May3103:37bbb.md-rw-r--r--1rootroot0May3103:37cbc.inidrwxr-xr-x2rootroot58May3103:39sh/[root/tmp/tmp]#ll[a-z]bc.ini-rw-r--r--1rootroot0May3103:37abc.ini-rw-r--r--1rootroot0May3103:37cbc.ini[root/tmp/tmp]#ll[ab]bc.ini-rw-r--r--1rootroot0May3103:37abc.ini2.基本正则表达式元字符的作用*前一个字符匹配0次或任意次数。匹配除换行符以外的任何字符^匹配行的开头。例如:^hello将匹配以hello开头的行$匹配该行的结尾。例如:hello$会匹配以hello结尾的行[]匹配括号中的任意一个字符,只能是一个字符。例如:[aeiou]匹配任意元音字符[0-9]匹配任意数字[a-z]匹配任意小写字母[^]取反,匹配除括号内字符以外的任意字符。例如:[^0-9]匹配任意非数字字符[^a-z]匹配任意非小写字母字符\转义字符,用于取消特殊符号的意义。例如:\。匹配符号'.'\{n\}表示前面的字符正好出现n次。\{n,\}表示前面的字符至少出现n次。\{n,m\}表示前面的字符最少出现n次,最多出现m次。0、测试文件使用grep-n'[正则表达式]'[文件]命令输出匹配的行,并显示行号。test.md1a2aa3aaa4aaaa5aaaaa67b8bb9bbb10bbbb11bbbbb1213ab14aab15abcb16abcde1718said19soid20suud21sooooood22230234562412234562512326344527425asdf28dasd1234ff29303.141592631helloworld.32332018-05-31342017-02-223536192.168.33.1037255.255.255.255380.0.0.01。*前一个字符匹配0次或任意次数2..匹配除换行符以外的任何字符。*匹配所有内容,包括空行s..d匹配s中a和d之间有两个字符的行[root/tmp]#grep-n's..d'test.md18:said19:soid20:suuda.c匹配a和c之间有一个字符的行[root/tmp]#grep-n'a.c'test.md15:abcb16:abcdea.*d匹配a和d之间有0个或多个字符的任何行[root/tmp]#grep-n'a.*d'test.md16:abcde18:said27:425asdf28:dasd1234ff3。^匹配行首,$匹配行尾^s匹配以s开头的行[root/tmp]#grep-n'^s'test.md18:said19:soid20:suud21:soooooodd$匹配行以d[root/tmp]#grep-n'd$'test.md18:said19:soid20:suud21:sooooood^$匹配所有空行[root/tmp]#grep-n'^$'test.md6:12:17:22:29:32:35:4。[]|匹配括号内的任意字符,只能匹配一个字符。s[aeiou]id匹配s和id之间只有一个元音的行[root/tmp]#grep-n's[aeiou]id'test.md18:said19:soids[aeiou]*d匹配s和d只有它们之间的任何0个或多个元音[root/tmp]#grep-n's[aeiou]*d'test.md18:said19:soid20:suud21:sooooood27:425asdf28:dasd1234ff[4-6]匹配包含任何数字的任何行在4-6[root/tmp]#grep-n'[4-6]'test.md23:02345624:122345626:344527:425asdf28:dasd1234ff30:3.141592633:2018-05-3136:192.168.33.1037:255.255.2之间[c-z]匹配以c-z之间的任何小写字母开头的行[root/tmp]#grep-n'^[c-z]'test.md18:said19:soid20:suud21:sooooood28:dasd1234ff31:helloworld.5。[^]取反,匹配除括号内字符以外的任何字符^[^a-z]匹配不以小写字母开头的行[root/tmp]#grep-n'^[^a-z]'test.md23:02345624:122345625:12326:344527:425asdf30:3.141592633:2018-05-3134:2017-02-2236:192.168.33.1037:255.255.255.290.z]匹配包含非数字和小写字母的行[root/tmp]#grepn'[^a-z0-9]'test.md30:3.141592631:helloworld.33:2018-05-3134:2017-02-2236:192.168.33.1037:255.255.255.25538:0.0.0.06。\|转义字符,用于取消特殊符号的含义\。匹配包含'.'[root/tmp]#grep-n'\.'的行测试.md30:3.141592631:helloworld.36:192.168.33.1037:255.255.255.25538:0.0.0.0\.$匹配以“.”结尾的行[root/tmp]#grep-n'\.$'test.md31:你好世界。7.\{n\}表示前面的字符正好出现n次a\{3\}匹配a连续出现3次的行[root/tmp]#grep-n'a\{3\}'test.md3:aaa4:aaaa5:aaaaa[0-9]\{5\}匹配包含5个连续数字的行[root/tmp]#grep-n'[0-9]\{5\}'test.md23:02345624:122345630:3.14159268。\{n,\}表示前面的字符至少出现n次a\{3,\}匹配a至少出现3次的行[root/tmp]#grep-n'a\{3,\}'test.md3:aaa4:aaaa5:aaaaa[0-9]\{5,\}匹配包含至少5个连续数字的行[root/tmp]#grep-n'[0-9]\{5,\}'测试.md23:02345624:122345630:3.14159269。\{n,m\}表示前面的字符最少出现n次,最多出现m次s[a-z]\{2,5\}d匹配s和d之间最少2个字母最多5个字母的行[root/tmp]#grep-n's[a-z]\{2,5\}d'test.md18:said19:soid20:suud3.几个例子1.匹配日期格式'YYYY-MM-DD'并不是严格匹配日期格式,而是实际匹配'9999-99-99'[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}[root/tmp]#grep-n'[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}'test.md33:2018-05-3134:2017-02-22[0-9]\{4\}\(-[0-9]\{2\}\)\{2\}[root/tmp]#grep-n'[0-9]\{4\}\(-[0-9]\{2\}\)\{2\}'测试.md33:2018-05-3134:2017-02-222。匹配的IP地址并不是严格匹配IP地址,实际匹配的是0.0.0.0-999.999.999.999,而实际的IP地址只匹配到255.255.255.255[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}[root/tmp]#grep-n'[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'test.md36:192.168.33.1037:255.255.255.25538:0.0.0.0[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}[root/tmp]#grep-n'[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}'测试。md36:192.168.33.1037:255.255.255.25538:0.0.0.0
