[ SHELL编程 ] 通配符与基础正则表达式、扩展正则表达式

在Linux命令行操作或者SEHLL编程中总是容易混淆一些特殊字符的使用,比如元字符‘*’号,作为通配符匹配文件名时表示0个到无穷多个任意字符。而作为正则表达式匹配字符串时,表示重复0个到无穷多个的前一个字符。对于通配符和正则表达式之间容易理解的方法就是,在文本过滤命令中这些元字符是用做正则表达式,比如像awk,sed,grep等,主要是针对文件内容的。然而通配符多用在文件名上,比如查找find,ls,cp,mv等等。没有特殊说明,正则表达式就是指基础正则表达式。

1、通配符

通配符
符号含义
*表示0~n个任意字符
?表示1个任意字符
[]表示一定有一个在中括号内的字符(非任意字符)。例如[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的起始与结束
{}中间为命令块的组合

 4、实例

(1) 通配符与正则表达式中的星号(*)

  通配符*仅跟在e之后,查找出了example2.sh和example_test.sh文件名,

$ ls -a example*.sh
-rwxr-x--- 1 user user 117 8月  12 06:50 example2.sh
-rwxr-x--- 1 user user 272 8月  12 06:57 example.sh
-rw-rw-r-- 1 user user   0 8月  13 15:59 example_test.sh

正则表达式*,先创建文件,文件名为search.txt,内容如下

example2.sh
example.sh
example_test.sh
examplee.sh

执行结果如下,不显示example2.sh和example_test.sh字符串。

$ grep 'example*\.sh' search.txt 
example.sh
examplee.sh

(2)grep与基础正则表达式/扩展正则表达式。grep加参数E才支持扩展正则表达式,或者使用egrep

grep 'root|oracle' /etc/passwd #失效

加参数E支持扩展正则表达式或者使用egrep

grep -E 'root|oracle' /etc/passwd
egrep  'root|oracle' /etc/passwd

结果如下

root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

(3)sed命令与基础正则表达式/扩展正则表达式

sed -n '/example\{2\}/p' search.txt # output: examplee.sh
sed -n '/example{2}/p' search.txt  # output:空,不支持扩展正则表达式

加上参数-r,支持扩展正则表达式,对比基础正则表达式,书写更简单、直观。

sed -nr '/example{2}/p' search.txt  #output:examplee.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值