了解Linux正则表达式之前,需要了解Linux中通配符和正则的区别:通配符主要用于bash环境,而正则大多数用于Linux三剑客(grep、sed、awk)等中…且Linux中的正则又和其他开发环境下的正则有所区别,咱们暂时研究的还只是Linux环境下的正则…

通配符基础

通配符 描述 示例
* 任意多个字符 find . *.sh
代表任意一个字符 find . ?.sh
连续不同命令分隔 ls m1;ls m2
# 配置文件注释 ####crontab####
| 管道符 find . -type f -name "*.txt" | xargs rm -f
~ 用户的家目录 oldboy~
- 上一次操作目录 su -
$ 变量符号 $PATH   
/ /
> 重定向 echo “linux”>oldboy.sh
>> 追加重定向 echo “linux”>>oldboy.sh
< 输入 xargs –n 2 <oldboy.txt
<< 输入重定向 xargs –n 2 <<oldboy.txt
单引号所见即所得 echo ‘date’==>date
双引号变量置换

echo “date”==>date

num=3
echo “$num”==>3  

` 相当于$()

ls  ==>oldboy.sh
echo `ls`==>oldboy.sh

 

{] 内容序列 touch m{1..10}
cp file{,.bak}
! 取反 find .  -type f ! -name  "*.sh"
&& 并且 &&
|| 或者 ||

 

正则表达式基础组成

正则表达式 描述 示例
^ 匹配行首 ^abc   匹配以abc开头的行 
$ 匹配结尾 def$  匹配以def结尾的行
. 任意一个字符 a.c  匹配abc、adc等
\ 转义字符,还原字符本身含义 \.   代表点本身
* 重复0个或者多个前一个字符 o*  代表0个o或者多个o
.* 任意字符 ^.* 代表以任意字符开头
[abc] 匹配字符集合里的任意一个字符 [a-z][A-Z][0-9] 任意a-z,A-Z,0-9
[^abc] 匹配不包含^后的所有字符 [^abc]  不包含abc的所有字符
a\{n,m\}
a\{n,\}
a\{n\}
匹配重复n到m次a字符
重复至少n次
只重复n次
0\{0,3\} 0重复了0-3次
0\{3,\}重复至少3次0
0\{3\}只重复3次0
() 创建一个用于匹配的子串 ma(tri)?匹配max或maxtrix

扩展的正则表达式(grep –E 或者 egrep)

正则表达式 描述 示例
+ 匹配1个或者多个
(*是0个或者多个)
a+  匹配1个到多个a
匹配0个或者一个
(.是只有一个)
a? 匹配0个a或者1个a
| 同时过滤多个字符 grep –E “3306|1521” /etc/services

 

元字符

元字符(meta character)是一种Perl风格的正则表达式,只有一部分文本处理工具支持它,并不是所有的文本处理工具都支持。

正则表达式 描述 示例
\b 单词边界 \bcool\b 匹配cool,不匹配coolant
\B 非单词边界 cool\B 匹配coolant,不匹配cool
\d 单个数字字符 b\db 匹配b2b,不匹配bcb
\D 单个非数字字符 b\Db 匹配bcb,不匹配b2b
\w 单个单词字符(字母、数字与_) \w 匹配1或a,不匹配&
\W 单个非单词字符 \W 匹配&,不匹配1或a
\n 换行符 \n 匹配一个新行
\s 单个空白字符 x\sx 匹配x x,不匹配xx
\S 单个非空白字符 x\S\x 匹配xkx,不匹配xx
\r 回车 \r 匹配回车
\t 横向制表符 \t 匹配一个横向制表符
\v 垂直制表符 \v 匹配一个垂直制表符
\f 换页符 \f 匹配一个换页符

 

POSIX字符类

POSIX字符类是一个形如[:...:]的特殊元序列(meta sequence),他可以用于匹配特定的字符范围

正则表达式 描述 示例
[:alnum:] 匹配任意一个字母或数字字符 [[:alnum:]]+
[:alpha:] 匹配任意一个字母字符(包括大小写字母) [[:alpha:]]{4}
[:blank:] 空格与制表符(横向和纵向) [[:blank:]]*
[:digit:] 匹配任意一个数字字符 [[:digit:]]?
[:lower:] 匹配小写字母 [[:lower:]]{5,}
[:upper:] 匹配大写字母 ([[:upper:]]+)?
[:punct:] 匹配标点符号 [[:punct:]]
[:space:] 匹配一个包括换行符、回车等在内的所有空白符 [[:space:]]+
[:graph:] 匹配任何一个可以看得见的且可以打印的字符 [[:graph:]]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [[:xdigit:]]+
[:cntrl:] 任何一个控制字符(ASCII字符集中的前32个字符) [[:cntrl:]]
[:print:] 任何一个可以打印的字符 [[:print:]]