Linux
正则表达式

你有没有想过,在 shell 命令行中的 *,?正则表达式中的*,?是否一样?

自打好多年前接触 DOS,就知道了*?这两个通配符(Wildcard),象 dir *.* 这样的命令也不知道敲了多少遍。

后来,开始用 Windows 3.1 这样的图形界面操作系统,命令行就就得越来越少了。

再后来,开始学习正则表达式,又开始接触 *? 这样的东西。在正则中它们被称为元字符(Meta Character)。

再再后来,开始使用 Linux,于是又开始使用命令行,又开始在命令行中使用 *?

最终,这两种形同且意相似,实质上完全不同但又有神秘联系的东西成功地交织一起,把我彻底搞凌乱了。

不过,搞清楚它们的不同之处,就不会凌乱了。

Shell 命令中的通配符

在操作系统的 Shell 命令中,*?这样的通配符和其它字符一起组合成表达式,用于匹配符合条件的文件名。

  • *: 匹配任意长度的字符串。这个字符串的长度可以是0,可以是1,可以是任意数字

  • ?: 匹配任意一个字符。

例如,a?c.* 可以匹配 abc.oaxc.docsazc.htm 这样的文件名。

通配符在 DOS/Windows 和 Linux 中的差别

  1. 在 Linux 中,? 只能匹配一个字符。但在 DOS/Windows 中,如果 ? 处于末尾或者 . 的前面,它也可以匹配零个字符。例如在 DOS/Windows 中,abc?.* 可以匹配 abc.htmlabcd.md 这样的文件名。

  2. 在 DOS/Windows 中,? 不能匹配文件名中的 . 。比如 abc?md 不能匹配 abc.md

  3. 在 Linux 中,如果 . 在文件名的开头,不能用 *? 来匹配。

  4. 另外,以 . 开头的文件名在 Linux 中很普遍,但在 DOS/Windows 中就很另类,会产生些问题。不提了,不提了,都是坑。

正则表达式中的元字符

在正则表达式中,*?这样的元字符、其它元字符以及普通字符组合在一起形成一个Pattern,用于匹配字符串。比如在文本文件中找出所有包含某个字符串的行。

  • *: 匹配前面的表达式零次或多次。

  • ?: 匹配前面的表达式零次或一次。

表达式可以是一个字符,也可以是( )中的字符序列。

例如,ab*c 可以匹配 acabccacefdabbbbbcf 这样的字符串

两者的区别

区别一:作用对象不同

这一点前面已经说过了:一个用于 Shell 命令中匹配文件名,另一个用于文本处理中匹配相应的字符串。

区别二:工作方式不同

  • 在命令行中,通配符是占位符,可以独立使用,跟前面的字符没关系。比如 abc*,表示一个字符串以 abc 开始,然后跟 0 个或多个任意字符。

  • 在正则表达式中,*? 是对前面的表达式进行匹配次数限制,不能独立使用的。比如 abc*,表示字符串中包含 ab,后面跟上 0 个或多个 c 。这个表达式可以匹配 ab, abc, abcc, abcccd 这样的字符串。这里的 * 作用在它前面的 c上(如果想作用于它前面的 abc,要写成 (abc)* )。

举两个例子:

  • ?

    • 用于命令行文件名匹配时,可以匹配只有一个字符的名字:tx等;

    • 用于正则表达式中字符串匹配时,它是无效表达式。

  • a*

    • 当匹配文件名时,可以匹配任何以字符 a开始的文件名。

    • 当匹配字符串时,它可以匹配 0 个 a (即空字符串),1 个 a,2 个 a,n 个 a。因为可以匹配 0 个 a,也就是空白,当做用于一个文本文件时,这个正则表达式可以匹配任何行(包括空白行),所以这样写没有意义。要想匹配至少一个 a,要写成 aa* 。要匹配至少两个连续的 a ,要写成 aaa*

区别三:匹配范围不同

  • 命令行中的表达式是完全匹配,表达式必须跟文件名一致才能匹配。

  • 正则表达式是包含匹配,只要字符串包含该表达式就能匹配。

举两个例子:

  • aa:

    • 在命令行中只能匹配文件名 aa

    • 作为正则表达式,只要字符串中包含 aa 就可以匹配上,比如aaxyz123aaxyz

  • ab?:

    • 在命令行中只能匹配文件名 abcabe等,但不能匹配 abccxyabef

    • 作为正则表达式,不但能匹配 abcabe等,还能匹配 xxabcdefabc123 等。

两者的联系

两者之间还是有些联系的,纯粹靠区别还不足以把人搞凌乱。

通配符也可以用在字符串匹配上

它们也可用在一般的字符串查找上。比如在查询系统中,你可以使用通配符来实现简单的模糊查询。这时它们的工作方式跟命令行是一致的。许多系统都提供了基于通配符的简单查询和基于正则表达式的复杂查询。

在我们经常使用的 SQL 中,%_这两个字符就作为通配符,跟 LIKE 操作符一起,用于字符串匹配。但 SQL 也提供了基于正则的字符串匹配操作。

在正在表达式中也有通配符

正则的元字符 . 有时也被称为通配符,因为它可以匹配任意一个字符。

通配符有等价的正则表达式

若不考虑 ? 可以匹配零个字符这种情况,通配符和正则有下面的关系:

通配符 等效的正则表达式
? .
* .*

通配符、正则表达式可以放在一起使用

Linux grep 命令就是一个很好的例子。这个命令的参数可以同时包括通配符和正则表达式,大家自己去体会吧。真个是:联袂而至,没有最凌乱,只有更凌乱。

* 和 ?在 shell 命令行中与在正则表达式中的区别的更多相关文章

  1. 几种在shell命令行中过滤adb logcat输出的方法

    我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adblog ...

  2. Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件

    Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...

  3. Linux命令行批量替换多文件中的字符串【转】

    Linux命令行批量替换多文件中的字符串[转自百度文库] 一种是Mahuinan法,一种是Sumly法,一种是30T法分别如下: 一.Mahuinan法: 用sed命令可以批量替换多个文件中的字符串. ...

  4. 自学Linux Shell2.1-进入shell命令行

    点击返回 自学Linux命令行与Shell脚本之路 2.1-进入shell命令行 进入文本命令行界面(CLI)两种方法: 控制台终端 图形化终端 1. 通过Linux控制台终端访问CLI 按下Ctrl ...

  5. Hadoop HDFS的shell(命令行客户端)操作实例

    HDFS的shell(命令行客户端)操作实例 3.2 常用命令参数介绍 -help 功能:输出这个命令参数手册 -ls                  功能:显示目录信息 示例: hadoop fs ...

  6. Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本

    Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...

  7. HDFS shell命令行常见操作

    hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...

  8. Shell 命令行,实现对若干网站状态批量查询是否正常的脚本

    Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...

  9. Shell 命令行统计 apache 网站日志访问IP以及IP归属地

    Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...

随机推荐

  1. Popup.js

    test.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> ...

  2. ios 微信开发

    首先依照对应的文档获得对应的key - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS ...

  3. 从零開始学android&lt;ScrollView滚动视图.十八.&gt;

    因为手机屏幕的高度有限.所以假设面对组件要显示多组信息的时候,ScrollView视图(滚动视图)能够有效的安排这些组件,浏览时能够自己主动的进行滚屏的操作. android.widget.Scrol ...

  4. hdu4711Weather 概率dp

    //第i个城市到第j个城市的概率ma[i][j] //第i天的天气天气wet[i] //第i个城市天气为j的概率wet_m[i][j] //Hovey从0点開始,找出其概率最大的路线 //dp[i][ ...

  5. python访问纯真IP数据库的代码

    通过IP地址判断客户端是网通的还是电信的. 使用一个纯文本的IP纯真数据库,用Python写了一个小程序. 核心代码: #!/usr/bin/env python #site www.jbxue.co ...

  6. C#元祖Tuple的事例

    数组合并了同样类型的对象.而元祖合并了不同类型的对象.元祖起源于函数编程语言(F#) NET Framework定义了8个泛型Tuple(自NET4.0)和一个静态的Tuple类,他们作用元祖的工厂, ...

  7. Oracle之配置客户端登陆多个远程数据库

    一.引言 一直搞不明白Oracle数据库的客户端是怎么回事,怎么配置,前几天由于工作中需要用到Oracle,而且需要连接两个不同的数据库,就通过上网和请教同事终于把客户端的配置搞定了,记录之,学习之 ...

  8. 【未完成】junit简单使用

    参考资料: 一般使用:https://www.w3cschool.cn/junit/ 集成spring: https://www.cnblogs.com/faramita2016/p/7637086. ...

  9. java -jar命令

    1.用eclipse的export导出jar包后,打开jar中的MANIFEST.MS文件,修改如下: 2.然后在命令行中输入命令:java -jar aa.jar即可.

  10. 解决windows server 2008 r2 右键没有个性化

    装完系统发现桌面上只有一个回收站我的电脑 网络邻居 控制板面都没有好像win7家庭版也没有右键–个性化设置上google百度了下 也还漫简单的点左下角的开始-运行:"C:\Windows\s ...