* 和 ?在 shell 命令行中与在正则表达式中的区别
你有没有想过,在 shell 命令行中的 *,?
和正则表达式中的*,?
是否一样?
自打好多年前接触 DOS,就知道了*
和?
这两个通配符(Wildcard),象 dir *.*
这样的命令也不知道敲了多少遍。
后来,开始用 Windows 3.1 这样的图形界面操作系统,命令行就就得越来越少了。
再后来,开始学习正则表达式,又开始接触 *
和 ?
这样的东西。在正则中它们被称为元字符(Meta Character)。
再再后来,开始使用 Linux,于是又开始使用命令行,又开始在命令行中使用 *
和 ?
。
最终,这两种形同且意相似,实质上完全不同但又有神秘联系的东西成功地交织一起,把我彻底搞凌乱了。
不过,搞清楚它们的不同之处,就不会凌乱了。
Shell 命令中的通配符
在操作系统的 Shell 命令中,*
和?
这样的通配符和其它字符一起组合成表达式,用于匹配符合条件的文件名。
*
: 匹配任意长度的字符串。这个字符串的长度可以是0,可以是1,可以是任意数字?
: 匹配任意一个字符。
例如,a?c.*
可以匹配 abc.o
,axc.docs
,azc.htm
这样的文件名。
通配符在 DOS/Windows 和 Linux 中的差别
在 Linux 中,
?
只能匹配一个字符。但在 DOS/Windows 中,如果?
处于末尾或者.
的前面,它也可以匹配零个字符。例如在 DOS/Windows 中,abc?.*
可以匹配abc.html
,abcd.md
这样的文件名。在 DOS/Windows 中,
?
不能匹配文件名中的.
。比如abc?md
不能匹配abc.md
。在 Linux 中,如果
.
在文件名的开头,不能用*
或?
来匹配。另外,以
.
开头的文件名在 Linux 中很普遍,但在 DOS/Windows 中就很另类,会产生些问题。不提了,不提了,都是坑。
正则表达式中的元字符
在正则表达式中,*
和?
这样的元字符、其它元字符以及普通字符组合在一起形成一个Pattern,用于匹配字符串。比如在文本文件中找出所有包含某个字符串的行。
*
: 匹配前面的表达式零次或多次。?
: 匹配前面的表达式零次或一次。
表达式可以是一个字符,也可以是( )
中的字符序列。
例如,ab*c
可以匹配 ac
,abcc
,acef
, dabbbbbcf
这样的字符串
两者的区别
区别一:作用对象不同
这一点前面已经说过了:一个用于 Shell 命令中匹配文件名,另一个用于文本处理中匹配相应的字符串。
区别二:工作方式不同
在命令行中,通配符是占位符,可以独立使用,跟前面的字符没关系。比如
abc*
,表示一个字符串以abc
开始,然后跟 0 个或多个任意字符。在正则表达式中,
*
和?
是对前面的表达式进行匹配次数限制,不能独立使用的。比如abc*
,表示字符串中包含ab
,后面跟上 0 个或多个c
。这个表达式可以匹配ab
,abc
,abcc
,abcccd
这样的字符串。这里的*
作用在它前面的c
上(如果想作用于它前面的abc
,要写成(abc)*
)。
举两个例子:
?
用于命令行文件名匹配时,可以匹配只有一个字符的名字:
t
,x
等;用于正则表达式中字符串匹配时,它是无效表达式。
a*
当匹配文件名时,可以匹配任何以字符
a
开始的文件名。当匹配字符串时,它可以匹配 0 个
a
(即空字符串),1 个a
,2 个a
,n 个a
。因为可以匹配 0 个a
,也就是空白,当做用于一个文本文件时,这个正则表达式可以匹配任何行(包括空白行),所以这样写没有意义。要想匹配至少一个a
,要写成aa*
。要匹配至少两个连续的a
,要写成aaa*
。
区别三:匹配范围不同
命令行中的表达式是完全匹配,表达式必须跟文件名一致才能匹配。
正则表达式是包含匹配,只要字符串包含该表达式就能匹配。
举两个例子:
aa
:在命令行中只能匹配文件名
aa
;作为正则表达式,只要字符串中包含
aa
就可以匹配上,比如aaxyz
,123aaxyz
。
ab?
:在命令行中只能匹配文件名
abc
,abe
等,但不能匹配abcc
,xyabef
。作为正则表达式,不但能匹配
abc
,abe
等,还能匹配xxabcdef
,abc123
等。
两者的联系
两者之间还是有些联系的,纯粹靠区别还不足以把人搞凌乱。
通配符也可以用在字符串匹配上
它们也可用在一般的字符串查找上。比如在查询系统中,你可以使用通配符来实现简单的模糊查询。这时它们的工作方式跟命令行是一致的。许多系统都提供了基于通配符的简单查询和基于正则表达式的复杂查询。
在我们经常使用的 SQL 中,%
和_
这两个字符就作为通配符,跟 LIKE 操作符一起,用于字符串匹配。但 SQL 也提供了基于正则的字符串匹配操作。
在正在表达式中也有通配符
正则的元字符 .
有时也被称为通配符,因为它可以匹配任意一个字符。
通配符有等价的正则表达式
若不考虑 ?
可以匹配零个字符这种情况,通配符和正则有下面的关系:
通配符 | 等效的正则表达式 |
---|---|
? |
. |
* |
.* |
通配符、正则表达式可以放在一起使用
Linux grep 命令就是一个很好的例子。这个命令的参数可以同时包括通配符和正则表达式,大家自己去体会吧。真个是:联袂而至,没有最凌乱,只有更凌乱。
* 和 ?在 shell 命令行中与在正则表达式中的区别的更多相关文章
- 几种在shell命令行中过滤adb logcat输出的方法
我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adblog ...
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...
- Linux命令行批量替换多文件中的字符串【转】
Linux命令行批量替换多文件中的字符串[转自百度文库] 一种是Mahuinan法,一种是Sumly法,一种是30T法分别如下: 一.Mahuinan法: 用sed命令可以批量替换多个文件中的字符串. ...
- 自学Linux Shell2.1-进入shell命令行
点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...
- Hadoop HDFS的shell(命令行客户端)操作实例
HDFS的shell(命令行客户端)操作实例 3.2 常用命令参数介绍 -help 功能:输出这个命令参数手册 -ls 功能:显示目录信息 示例: hadoop fs ...
- Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...
- HDFS shell命令行常见操作
hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...
- Shell 命令行,实现对若干网站状态批量查询是否正常的脚本
Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...
- Shell 命令行统计 apache 网站日志访问IP以及IP归属地
Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...
随机推荐
- 【转贴】J2EE中的13种技术规范
J2EE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单 ...
- 要练习的lambda
取list的id 放入新List<Integer> List<Integer> list1 = list.stream().map(albumGroup1 -> albu ...
- unity 已知cosA和sinA,求A
和c++中的atan2(y,x)类似,unity中有也Mathf.Atan2(y,x).
- javascript跨域訪问探索之旅
需求: 近期工作负责一个互联网应用A(我公司应用)与还有一个互联网应用B进行通讯.通讯的方式是这种:还有一个互联网应用某些表单信息须要从我公司的互联网应用获取.首先用户訪问互联网应用B ...
- Java服务CPU占用高问题定位方法
1. 概述 提供一种简单的方法来定位CPU高的问题. 找到CPU高的进程,比如232543: 执行top -H -p pid,找到占用CPU最高的线程号,比如232544,转换成16进制38c60: ...
- LFCS 系列第八讲:管理用户和用户组、文件权限和属性以及启用账户 sudo 访问权限
由于 Linux 是一个多用户的操作系统(允许多个用户通过不同主机或者终端访问一个独立系统),因此你需要知道如何才能有效地管理用户:如何添加.编辑.禁用和删除用户账户,并赋予他们足以完成自身任务的必要 ...
- iOS图片上传及压缩
提到从摄像头/相册获取图片是面向终端用户的,由用户去浏览并选择图片为程序使用.在这里,我们需要过UIImagePickerController类来和用户交互. 使用UIImagePickerContr ...
- 接口测试脚本之Jsoup解析HTML
第一次接触jsoup还是在处理收货地址的时候,当时在写一个下单流程,需要省市区id以及详细门牌号等等,因此同事介绍了jsoup,闲来无事,在此闲扯一番! 1.我们来看下,什么是jsoup,先来看看官方 ...
- linux内存排查工具valgrind
官网:http://valgrind.org/info/about.html 百科介绍:http://baike.baidu.com/link?url=ZdXzff0omzoPpE_yZUlNW9lJ ...
- Powershell对象条件查询筛选
在 Windows PowerShell 中,与所需的对象数量相比,通常生成的对象数量以及要传递给管道的对象数量要多得多.可以使用 Format cmdlet 来指定要显示的特定对象的属性,但这并不能 ...