前言
学习正则之前,我们首先来了解清楚双引号和单引号中区别,双引号中可解析哪些特殊字符?
1. 单双引号、无引号三者之间的区别:
单引号: 单引号是全引用,被单引号括起的内容不管是常量还是变量都不会发生替换。
双引号: 双引号引用的内容,所见非所得。如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容。双引号是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
无引号: 不使用引号定义字符串时,字符串不能包含空白字符(如Space或Tab),需要该加引号,一般连续的字符串,数字,路径等可以不加引号。如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容。
2. 哪些字符在双引号中是可以被解析出来的字符呢?哪些命令在双引号中可以被执行呢?
双引号中特殊字符:
SHell的元字符(* ? [] () {} )
转义符: \
命令替换: `` $()
其他: $
3. 正则表达式: 什么是正则表达式呢?
正则表达式(Regular expression,RE)是一种字符模式,用于在查找过程中匹配指定的字符。在i大多数程序里,正则表达式被置于两个斜杠之间。例如:/I[oO]ve/ 就是由斜杠界定的正则表达式它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。
此处的元字符和shell的元字符是不一样的。这是正则元字符。shell中元字符之前已了解啦,现在了解下正则中的元字符:
4. 正则中的元字符
定义: 元字符是这样一类字符,它们表达的是不同于字面本身的含义。
shell元字符由shell来解析,正则表达式的元字符由各种执行 模式匹配 操作的程序来解析,比如 vi grep sed awk python Apache Nginx. .... 模式需不需要加引号呢?在模式里面没有空格的时候可以不加引号,但是为了安全起见 还是都加上引号吧。在正则模式中加单引号双引号都一样。
以下有几个例子:
匹配数字: ^[0-9]+$
匹配Mail: [a-z0-9_]+@[a-z0-9]+\.[a-z]+
匹配IP: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
或: [[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}
4-1) 基本正则中的元字符:
基本正则元字符 [-] 匹配指定范围内的一个字符,在shell元字符也有这个。但是在shell中[a-z]可以匹配单个 大小写字母,不区分大小写,在正则中要区分大小写。也可写成 [a-Z] 包含所有大小写字母任意一个。
. 是匹配初换行符外的任意一个字符,.* 代表的就是整行。 下面 3:9 s/\(.*\)/#\1/ 表示把3-9行注释掉
4-2) 正则中的扩展元字符: 需要使用 egrep
注意:
+ ? * {} : 这四个元字符都是为别的字符而存在的。他们匹配的前导字符都是一个,即前面单个字符。
| ^ $ : 匹配的是前面或后面的整个字符串(没有包含空格的一串)。
要想指定这些元字符匹配多长的字符串,用下面的组字符(),把括起来的字符串当成一组。
4-3) POSIX 字符类
注意这双方括号含义:外面一层方括号代表[] 里面的字符出现一次。里面一层方括号代表表达式。
正则的一些练习,今天就来看懂下面的所有正则吧:
/.*/ 整行
/^$/ 空行(只有一个回车的叫空行) 这里面还是由回车的 和什么都没有不同
/^[ \t]*$/ 这是表示 以0-n 个 空格 或 0-n个 tab键开头的行
/^#/ 匹配注释行
/^[ \t]*#/ 匹配注释行(这个注释前面可能会有空格或tab键)
20200220