在Linux系统管理或者SEHLL编程中总是容易混淆或者使用错一些字符,比如元字符‘*’号,作为通配符匹配文件名时表示代表0个到无穷多个任意字符。作为正则表达式匹配字符串使用时,表示重复0个到无穷多个的前一个字符。
查找了一些资料,发现一个比较容易方便理解的方法就是,在文本过滤工具里,这些元字符都是用做正则表达式,比如像awk,sed,grep等,是针对文件内容的。而通配符多用在文件名上,比如查找find,ls,cp,mv等等。没有特殊说明,正则表达式就是指基础正则表达式。
1、通配符
符号 | 含义 |
* | 代表0个到多无穷多个任意字符 |
? | 代表一定有一个任意字符 |
[] | 同样代表一定有一个在中括号的字符(非任意字符)。例如[abcd]代表一定有1个字符,可能是a、b、c、d这四个任何一个。 |
[-] | 若有减号在中括号内时,代表在编码顺序内的所有字符。例如[0-9]表示0到9之间的所有数字,因为数字的语系编码时联系的 |
[^] | 若中括号内的第一个字符为指数符号^,那表示原向选择。例如[^abc]代表一定有一个字符,只要是非a、b、c的其他字符都接收的意思 |
2、基础正则表达式
RE字符 | 含义 | 实例 |
^word | 待查找的字符串(word)在行首 |
查找行首为#开始的那一行,并列出行号 grep -n '^#' regular_express.txt |
word$ | 待查找的字符串(word)在行尾 |
查找行尾为!开始的那一行,并列出行号 grep -n '!$' regular_express.txt |
. | 代表一个右一个任意字符的字符 |
查找字符串可以是(eee)(eae)(eee),但不能仅有(ee),即e与e之间一定仅有 一个字符,而空格符也是字符 grep -n 'e.e' regular_express.txt |
\ | 转移字符,将特殊符号的特殊意义去除 |
找出含有单引号(')的行,并显示行号 grep -n "\'" regular_express.txt |
* | 重复0个到无穷多个的前一个字符 |
找出含有(es)(ess)(esss)等的字串,并显示行号 grep -n 'es*' regular_express.txt |
[list] | 从字符集合的RE字符里面找出想要选取的字符 |
查找含有(gl)(gd)的行,并显示行号 grep -n 'g[ld]' regular_express.txt
|
[n1-n2] | 从字符集合的RE字符里面找出想要选取的字符范围 |
查找含有数字的行,并显示行号 grep -n '[0-9]' regular_express.txt |
[^list] | 从字符集合的RE字符里面找出不要的字符串或范围 |
查找不包含oot的行,并显示行号 grep -n 'oo[^t]' regular_express.txt |
\{n\} | 匹配连续n个的前一个RE字符 |
查找包含3个数字的行,并显示行号 grep '[0-9]\{3\}' regular_express.txt |
\{n,m\} | 匹配连续n到m个的前一个RE字符 | 查找包含3到5个数字的行,并显示行号 grep '[0-9]\{3,5\}' regular_express.txt |
\{n,\} | 匹配连续n个以上的前一个RE字符 | 查找包含至少3个数字的行,并显示行号 grep '[0-9]\{3,\}' regular_express.txt |
3、扩展正则表达式
RE字符 | 含义 | 实例 |
+ | 重复1个或1个以上的前1个RE字符 |
查找(god)(good)(goood)等的字符串 egrep -n 'go+d' regular_express.txt |
? | 0个或1个的前1个RE字符 |
查找(god)(good)这两个字符串 egrep -n 'go?d' regular_express.txt |
| | 用或(or)的方式找出数字字符串 |
查找(gd)(good)这两个字符串 egrep -n 'gd|good' regular_express.txt |
() | 找出‘组’ 字符串 |
找出(glad)或(good)这两个字符串,g与d是重复的,所以可以将la与oo列于() 当中,并以|来分隔 egrep -n 'g(la|oo)d' regular_express.txt |
()+ | 多个重复组的判别 |
查找A开头C结尾,中间有一个以上的‘xyz’字符串 echo 'AxyzxyzxyzC' | egrep 'A(xyz)+C' |
4、bash环境特殊符号
了解了通配符、基础/扩展正则表达式,还需要了解bash环境中的一些特殊符号。这些符号作为匹配条件时是否需要转移经常容易弄混淆,转义不转义搞的很纠结。先看下有哪些特殊符号。
符号 | 含义 |
# | 注释符号 |
\ | 转义符号,将‘特殊字符或通配符’还原成一般字符 |
| | 管道(pipe),分隔两个管道命令的界定 |
; | 连续命令执行分隔符,连续命令的界定 |
$ | 使用变量前导符,即使变量之前需要加的变量替代值 |
& | 作业控制,将命令放入后台执行 |
! | 逻辑运算意义上的非(not) |
/ | 目录符号,路径分隔的符号 |
>,>> | 数据流重定向,输出导向,分别是替换和累加 |
<,<< | 数据流重定向,输入导向 |
'' | 单引号,不具有变量替换的功能 |
"" | 双引号,具有变量替换的功能 |
`` | 反单引号,连个反单引号(``)中间为可以先执行的命令,也可以使用$() |
() | 中间为子shell的起始与结束 |
{} | 中间为命令块的组合 |