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

1、通配符

Linux中通配符主要包括*、?、[]、[-]、[^]。下面详细介绍它们的作用。

* 表示0~n个任意字符。

  ? 表示任意1个字符。

  [] 表示一定有一个在中括号内的字符(非任意字符)。如[abcd]表示一定有1个字符,可能是a、b、c、d这四个任何一个。

[-] 若有减号在中括号内时,代表在编码顺序内的所有字符。如[0-9]表示0到9之间的所有数字,[a-z]表示小写字符,[A-Z]表示大写字符,[a-zA-Z]表示大小写字符。

[^] 若中括号内的第一个字符为指数符号^,那表示反向选择。例如[^abc]表示匹配非a、b、c的其他字符。

区别与联系:

(1)Linux中通配符用于匹配文件名。正则表达式用例匹配文件内容、字符串。

  (2)通配符范围仅限*、?、[]、[-]、[^]。不是所有的正则表达式符号都是通配符。

(3)注意通配符*与?与正则表达式中*与?的区别。在正则表达式中*表示重复前1个字符0-n次。?表示重复前1个字符0-1次。这个是比较特殊地方,一定注意区分。

2、基础正则表达式(BRE,Basic Regular Expression)

POSIX规范将正则表达式分为基础正则表达式(BRE)和扩展正则表达式(ERE),它们之间的区别仅仅是元字符不同。基础正则表达式(BRE)的元字符为^、$、.、[]、*。下面详细介绍基础正则表达式各元字符的含义:

^ 表示从行首匹配字符串。如查找以#开始的行 grep '^#' temp.txt

$ 表示从行尾开始匹配字符串。如查找以!结束的行 grep '!$' temp.txt

. 表示任意1个字符。如查找宝行以g开始、d结束的三个字符的行。grep 'e.e' temp.txt

  * 表示重复0个到无穷多个的前一个字符。找出含有e、es、ess、esss等的字串。grep 'es*' temp.txt

  [list] 表示从字符集合的RE字符里面找出想要选取的字符。查找含有(gl)(gd)的行,并显示行号 grep -n 'g[ld]' temp.txt

  [n1-n2] 从字符集合的RE字符里面找出想要选取的字符范围。查找含有数字的行 grep '[0-9]' temp.txt

  [^list] 从字符集合的RE字符里面找出不要的字符串或范围。查找不包含oot的行 grep 'oo[^t]' temp.txt

区别与联系:

(1)正则表达式用于匹配文件内容

(2)基础正则表达式中的元字符在反斜杠"\"转义处理下会被当做普通字符处理。

(3)注意正则表达式中*与?与通配符中*与?的区别。

3、扩展正则表达式(ERE,Basic Regular Expression)

扩展正则表达式(ERE)添加了+、?、|、()、{}元字符。下面详细介绍它们的作用。

  + 表示重复1个或1个以上的前1个字符。查找god、good、goood等字符串的行 grep -E 'go+d' temp.txt

? 表示0个或1个的前1个字符。查找god、good两个字符串的行。grep -E 'go?d' temp.txt

  | 表示用或(or)的方式找出匹配字符串。查找god、good这两个字符串的行。grep -E 'gd|good' temp.txt

() 找出‘组’ 字符串。找出(glad)或(good)这两个字符串的行。g与d是重复的,所以可以将la与oo列于()当中,并以|来分隔 grep -E 'g(la|oo)d' temp.txt

()+ 多个重复组的判别。查找A开头C结尾,中间有一个以上的‘xyz’字符串的行 echo 'AxyzxyzxyzC' | grep -E 'A(xyz)+C'

  {n} 匹配连续n个的前一个RE字符。查找包含3个数字的行 grep -E '[0-9]{3}' temp.txt

  {n,m} 匹配连续n到m个的前一个RE字符。查找包含3到5个数字的行 grep -E '[0-9]{3,5}' temp.txt

 {n,} 匹配连续n个以上的前一个RE字符。查找包含至少3个数字的行 grep -E '[0-9]{3,}' temp.txt

区别与联系:

(1)扩展正则表达式的表示字符范围比基础正则表达式多。如+、?、|、()等。

(2)扩展正则表达式中的元字符在转义字符"\"处理下会被当做普通元字符。

(2)使用扩展正则表达式可以更大范围满足匹配关系,使表达式表现形式更简洁。如使用“|”或完成同时匹配。

(3)指令操作时表现形式略有不同。Linux部分指令有支持参数,可以简化书写。如sed -r、grep -E参数表示支持扩展正则表达式。下文会介绍带支持扩展正则表达式参与与不带支持参数的指令书写上的区别。

4、bash环境特殊符号

了解通配符、基础正则表达式、扩展正则表达式后,同时了解一下bash环境中的一些特殊符号。这些符号作为匹配条件时是否需要转义经常容易弄混淆,转义不转义搞的很纠结。先看下有哪些特殊符号。

# 注释符号

\ 转义符号,将特殊字符或通配符还原成一般字符

  | 管道(pipe),分隔两个管道命令的界定

; 连续命令执行分隔符,连续命令的界定

$ 使用变量前导符,即使变量之前需要加的变量替代值

& 作业控制,将命令放入后台执行

逻辑运算意义上的非(not)

/ 目录符号,路径分隔的符号

  >,>> 数据流重定向,输出导向,分别是替换和累加

<,<< 数据流重定向,输入导向

'' 单引号,不具有变量替换的功能

  "" 双引号,具有变量替换的功能

  `` 反单引号,连个反单引号(``)中间为可以先执行的命令,也可以使用$()

() 中间为子shell的起始与结束

  {} 中间为命令块的组合

通配符与正则表达式使用实例

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

通配符用于匹配文件名,假设当前路径下包含如下文件

#ls
c.txt c1.txt c2.txt

执行ls c*.txt输出文件名,结果如下

#ls c*.txt
c.txt c1.txt c2.txt

正则表达式用于匹配文件内容。先创建文件temp.txt,内容如下

#cat temp.txt
ccc
cccc
cd1
cd2

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

#grep 'c*' temp.txt
ccc
cccc

(2)grep -E/egrep支持扩展正则表达式

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

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

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

结果如下

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

(3)sed -r支持扩展正则表达式

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

参考资料

1、《鸟哥的Linux私房菜(基础学习篇)》

Linux通配符与基础正则表达式、扩展正则表达式的更多相关文章

  1. linux正则表达式(基础正则表达式+扩展正则表达式)

    正则表达式应用非常广泛,例如:php,Python,java等,但在linux中最常用的正则表达式的命令就是grep(egrep),sed,awk等,换句话 说linux三剑客要想能工作的更高效,就一 ...

  2. linux通配符与基础正则

    1.特殊符号: ' '     单引号          单引号的内容     写什么就是什么,不会被当成特殊字符.       单引号实例:      [root@oldboyedu-sh01 ~] ...

  3. bash基础——grep、基本正则表达式、扩展正则表达式、fgrep

    grep grep全称:Globally search a Regular Expression and Print 全局搜索正则表达式 正规表达式本质上是一种"表示方法", 只要 ...

  4. 『忘了再学』Shell基础 — 25、扩展正则表达式

    目录 1.扩展正则表达式说明 2.练习 (1)+和?练习 (2)|和()练习 3.注意(重点) 1.扩展正则表达式说明 熟悉正则表达式的童鞋应该很疑惑,在其他的语言中是没有扩展正则表达式说法的,在Sh ...

  5. Linux学习(2)- 正则表达式基础

    Linux学习(2)- 正则表达式基础 一.基础正则表达式介绍与练习 学习内容 正则表达式特殊符号 [:alnum:]代表英文大小写字母及数字 [:alpha:]代表英文大小写字母 [:blank:] ...

  6. Linux扩展正则表达式

    1. 扩展正则表达式 1.1 +(加号) + 表示前一个字符出现1次或1次以上 1.1.1 理解+ 要求:取出文件内容连续出现的小写字母 [root@oldboyedu50-lnb /oldboy]# ...

  7. Bash 通配符、正则表达式、扩展正则表达式

    BASH中的通配符(wildcard) *:任意长度的任意字符. ?:任意单个字符 []:匹配范围 [^]:排除匹配范围 [:alnum:]:所有字母和数字 [:alpha:]:所有字母 [:digi ...

  8. linux 通配符与正则表达式

    linux通配符和三剑客(grep.awk.sed)正则表达式是不一样的 通配符一般用户命令行bash环境,而linux正则表达式用于awk.grep.sed

  9. Linux基础篇,正则表达式

    一.正则表达式特殊符号: 二.grep的用法 grep [-A|B|a|c|i|n|v] [--color=auto] '搜索字串' filename -A ===> after缩写,后面接数字 ...

随机推荐

  1. arcgis for android 读取shp文件中文乱码解决方法

    设置注册表默认字符,即可解决中文乱码问题. 'dbfDefault' 设置方法1.开始--运行,输入”Regedit“,打开注册表.2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ...

  2. 对偶上升法到增广拉格朗日乘子法到ADMM

    对偶上升法 增广拉格朗日乘子法 ADMM 交替方向乘子法(Alternating Direction Method of Multipliers,ADMM)是一种解决可分解凸优化问题的简单方法,尤其在 ...

  3. windows 日志解决方法

    1.sql server 2012 报错 MSSQLSERVER 服务无法使用当前配置的密码以 .\MSSQL_SF_A9JGSK 身份登录,错误原因如下: 此帐户的密码已过期. 要确保服务配置正确, ...

  4. python 实现排序算法(三)-选择排序和冒泡排序

    #/usr/bin/env python #coding:utf-8 #@auther="livermorium" ''' 选择排序 从数据中选择最小值,排在位置首位 再从剩余未排 ...

  5. svn下copy项目后定位到新资源库,产生不同版本号的方法

    转载于http://blog.csdn.net/u012990533/article/details/44776465 最近这两天,公司要做国际化的开发,本打算要用struts2内置的i18n拦截器做 ...

  6. dubbo-文档

    Srping版Dubbo集成中文地址:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/background.html SpringB ...

  7. python学习之----BeautifulSoup的find()和findAll()及四大对象

    BeautifulSoup 里的find() 和findAll() 可能是你最常用的两个函数.借助它们,你可以通 过标签的不同属性轻松地过滤HTML 页面,查找需要的标签组或单个标签. 这两个函数非常 ...

  8. WPF 选择电脑文件显示路径,弹出资源管理器,打开文件

    选择文件,将路径显示在名为txbx的textbox上 // 在WPF中, OpenFileDialog位于Microsoft.Win32名称空间 Microsoft.Win32.OpenFileDia ...

  9. Linux 虚拟机VMware安装失败,提示没有选择磁盘

    提示安装位置:没有选择磁盘 磁盘类型问题. 在新建虚拟机向导时会推荐选项 重新安装就有磁盘了

  10. Linux下安装PHP+Nginx+Msql

    安装Nginx: 1.先指定个文件存放位置  usr/local/src 2. 下载nginx,  wget http://nginx.org/download/nginx-1.12.0.tar.gz ...