linux shell通配符&&正则表达式

1,shell通配符

注意, 这里的通配符虽然和正则表达式相似,但是是基于bash解释器解析的,而正则表达式由正则引擎的软件(如awk,grep,sed等)解析,二者完全不同。

通配符字符
*代表0个或多个任意字符
?代表一定有一个任意字符
[ ][abcd],表示一个字符,或a或b或c或d
[-][0-9],表示一个数字,0到9之间的某个
[^][^abc],表示一个字符,且不是a、b、c

范例:
[python]  view plain  copy
  1. [root@linux ~]# ls test*     #那个 * 代表后面不论接几个字符都予以接受  
  2. [root@linux ~]# ls test?     #那个 ? 代表后面"一定"要接"一个"字符  
  3. [root@linux ~]# ls test???   #那个 ??? 代表"一定要接三个"字符!  
  4. [root@linux ~]# cp test[1-5] /tmp  # 将 test1, test2, test3, test4, test5 若存在的话,就拷贝到 /tmp  
  5. [root@linux ~]# cp test[!1-5] /tmp # 只要不是 test1, test2, test3, test4, test5 之外的其它 test?拷贝到 /tmp  
  6. [root@linux ~]# cd /lib/modules/`uname -r`/kernel/drivers  # 系统先执行 uname -r 找出输出结果;将结果累加在目录上面,来执行 cd 的功能!  
  7.                      = cd /lib/modules/$(uname -r)/kernel  #另外,这个 quot (`) 的功能,也可以利用 $() 来取代喔!  
  8. [root@linux ~]# cp *[A-Z]* /tmp   #表示文件中包含大写字母  
  9. [root@linux ~]# ls -lda /etc/*[35]* #表示文件中包含数字3或者5.  

正则表达式(regular express)基本上是一种“表示法”,他是以行为单位来进行字符串的处理行为。只能使用在支持它的工具程序(如vi、grep、awk、sed中)。 正则表达式与shell通配符的关系就像是局部变量和全局变量的关系 (即以后遇到一个命令如果支持正则表达式,则通配符概念抛弃。否则使用通配符)。

2,正则表达式特殊符号

字符类代表意义
[:alnum:]代表英文大小写字符及数字,即0-9,A-Z,a-z
[:alpha:]代表任何英文大小字符,即A-Z,a-z
[:lower:]代表小写字符,即a-z
[:upper:]代表大写字符,即A-Z
[:digit:]代表数字,即0-9
[:xdigit:]代表十六进制的数字类型,因此包括0-9,A-F,a-f的数字与字符
[:blank:]代表空格键与tab按键
[:graph:]除了空格与tab按键之外的其它所有按键
[:space:]任何会产生空白的字符,包括空格键,Tab键,CR等
[:cntrl:]代表键盘上面的控制按键,既包括CR,LF,Tab,Del等
[:print:]代表任意可打印字符
[:punct:]代表标点符号,即" ' ? ! ; : # $

3,基础正则表达式字符

基础正则表达式语法(RE语法):一个字符串如果是正则表达式表示的,则其中的任意字符被称为RE字符。

特殊字符为:
只支持普通正则表达式语法    ^  $  .  * \  [  ]  "  '      
支持扩展正则表达式语法        ^  $  .  * \  [  ]  "  '  +  ?  | ( ) 

基础RE字符意义与范例
^word意义:待查找的字符串(word)在行首
范例:查找行首为#开头的哪一行,并列出行号
grep -n '^#' regular_express.txt
word$意义:待查找的字符串(word)在行尾
范例:将行尾为!的那一行打印出来,并列出行号
grep -n '!$' regular_express.txt
.意义:代表一定有一个任意字符的字符(除换行符),在awk中可匹配换行符
范例:查找的字符串可以使(eve)(eae)(eee)等,即e与e之间一定要有一个字符,不能是(ee)!
grep -n 'e.e' regular_express.txt 
\意义:转义字符,将特殊符号的特殊意义去除,将普通字符变为特殊字符。
范例:查找含有单引号'的那一行
grep -n \' regular_express.txt  
*意义:重复0个到无穷多个前一个字符
范例:找出含有(es)(ess)(esss)等的字符串,注意,因为*可以是0个,所以es也是符合待查找字符串。另外,因为*为重复“前一个RE字符”的符号,因此在*之前一定要紧接着一个RE字符!例如任意字符则为.*
grep -n 'ess*' regular_express.txt
[list]意义:从字符集合的RE字符里面找出想要选取的字符(不包括换行符),在awk中可以包含换行符。注意此时中括号里的\.*等特殊字符均变成一般字符(除了[])。
范例:查找含有(gl)或(gd)的那一行,需要特别留意的是,在[]当中代表一个待查找的字符,例如“a[afl]y”代表查找的字符串可以是aay,afy,或aly
grep -n 'g[ld]' regular_express.txt
[n1-n2]意义:从字符集和的RE字符里面找出想要选取的字符范围
范例:查找含有任意数字的那一行。需特别留意,在字符集合[]中的减号-是有特殊含义的,它代表两个字符之间的所有连续字符(与编码顺序有关)
grep -n '[0-9]' regular_express.txt
[^list]意义:反向选择
范例:查找的字符串可以是(oog)(ood)但不能是(oot)
grep -n 'oo[^t]' regular_express.txt
\{n\}
\{n,\}
\{n,m\}
意义:连续n到m个的前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符 。
在支持扩展的正则表达式中用另一种形式,且n,m必须是0到255之间的整数:
注:本质上是扩展正则表达式的语法
范例:在g与g之间有2个到3个的o存在的字符串
grep -n 'go\{2,3\}' regular_express.txt  


4 扩展的正则表达式语法

若要支持:

grep需加-E (或者使用到扩展符号时加\)         

sed需加-r  (或者使用到扩展符号时加\)        

awk,perl本身支持扩展这则表达式(也就是说awk中如果要引用(为普通字符要[(]如此使用。)

扩展RE字符意义与范例
+意义:重复一个或一个以上的前一个RE字符
o+代表一个以上的o
?意义:零个或一个的前一个RE字符
o?代表空或o
|意义:用或(or)的方式找出数个字符串,两边的字符串不能加额外的空格,
ABC|DEF表示ABC或DEF,A(BC|DE)F表示ABCF或ADEF
范例:去除空白行和行首为#的行
grep -Env '^$|^#' regular_express.txt  
()意义:找出“组”字符串,[]的引申
范例:查找glad或good这两个字符串,因为g与d是重复的,所以可以将la与oo以或的方式列于()中
grep -En 'g(la|oo)d' regular_express.txt 
()+意义:重复一个或一个以上的前一个“组”
{n}
{n,}
{n,m}
与普通正则表达式含义一致,只是在支持扩展正则表达式中要用此形式,即awk、grep -E、sed -r 中使用。


5,元字符

元字符:是一种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意义:单个非单词字符
\n意义:换行符
\s意义:单个空白字符,换页、制表、换行、回车以及空格。[\f\t\n\r ]
\S意义:单个非空白字符
\r意义:回车


6,几种有用的正则表达式

项目正则表达式
匹配正规文本中的单词\b[[:alpha:]]+\b

(^| )["({[]*book[]})"?,.:;!'s ]*( |$)
匹配空行^$
匹配含有空格的空白行和空行^空格*$
匹配整个行^.*$
匹配一个或多个空格空格空格*
匹配s前面含有任意abc随机组合的字符串[abc]*s
匹配格式化的美元数额\$[空格0-9]*\.[0-9][0-9]
匹配电子邮件地址[A-Za-z0-9.]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}
匹配一个HTTP URLhttp://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值