十一、shell编程-正则表达式(1)
1.名词解析
正则表达式RE是一种字符模式,用于查找过程中匹配指定的字符。
在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/l[oO]ve/就是由正斜杠界定的正则表达式。
它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符串是最重要的概念。
2.工具
被vim、sed、awk、grep调用
3.场景
mysql、oracle、python、apache、nginx……需要正则
4.示例
需求
匹配数字的脚本:用户输入创建账号的数量
但是我们无法判断用户在输入数量时候是数字而不是其他符号。这里就能用到正则。
这里的意思是以0-9开头且至少有一个为结尾
5.正则表达式-元字符-基本型
基本正则表达式元字符
^ 行首定位符
$ 行尾定位符
. 匹配任意单个字符
* 匹配前导符0到多次 *只修饰前面不修饰后面,如果前面没有内容则无效
.* 任意多个字符
如果要搜.*的话,要带双引号".*",否则会把程序下的所有文件都搜出来,因为.*会被shell掳走,变成过滤该路径下的所有文件和love.txt文件的内容
[] 匹配指定范围内的一个字符
[-] 匹配指定范围内的有一个字符或连续的范围
[^] 匹配不在指定组内的字符,取反
\ 用来转移元字符 ('' "" \),脱意符
\是转义后一个字符,包括回车
\< 词首定位符 和^不一样
\> 词尾定位符
s/// 替换 s/原来/现在/
示例:把文件中的do换成da
这里的g是全局的意思,否则每一行只替换第一个
() 匹配搜后使用的字符的标签
示例1:需要在3到9行加注释
思路是
:3,9 s/// 3到9行开始替换
:3,9 s/(.*)/\1/ (.*)代表需要替换的是所有字符,\1代表引用前面的所有内容
:3,9 s/(.*)/#\1/ 在前面原文基础上加上#井号
:3,9 s/\(.*\)/#\1/ 给括号加上转义符
示例2:如果要让井号换到每行的结尾处
把#单独括起来为\1,其他内容括起来为\2,替换成\2\1
示例3:把3-9行的井号#去掉
把以井号结尾的除了#的内容括起开为\1,改为只有\1
x\{m\} 字符x重复出现m次
x\{m,\} 字符x重复出现m次以上
x\{m,n\} 字符x重复出现m到n次