Linux 通配符 与 正则表达式 的区别与详解

2023-11-10

背景:在linux使用过程中,经常需要查找文件,对命令中的通配符 pattern 和正则表达式的区分不是很清楚。有必要好好研究一下。

1 扫盲
1.1 通配符和正则表达式

当在使用命令行时,有很多时间都用来查找你所需要的文件,如 ls find 等。 Shell 提供了一套完整的字符串模式匹配规则,或者称之为元字符,当 Shell 遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名,我理解这可以称为通配符。

通配符与正则表达式是有区别的,简单来说:通配符是用来通配的,正则表达式是用来匹配字符串的;

通配符是shell自带的用于匹配文件名的工具,多用在文件名上,比如查找findlscp 等等,而正则表达式则需要特定命令的支持才可以使用,如:grepsedawk(号称Linux三剑客)、vi/vimperl等,这些都是处理文本的工具。

其次,shell对通配符与正则表达式的处理也有不同,“ ”内一般为通配符(是shell本身提取处理),‘ ’内一般为正则表达式(shell会将其中的数据传递给其它命令处理)。

  • 通配符

    常见元字符:
    *:匹配零或多个任意字符
    :匹配任意单个字符
    []:指定中括号内的多个字符,如:[rwc]或[r,w,c]都行
    [^][!]:除了中括号内字符外匹配任一个字符
    引用以下模式要在外面再套一个[],tr命令则不用(这是规定吗?)
    [:digit:]:匹配任意一个数字
    [:lower:]:任意小写字符
    [:upper:]:任意大写字符
    [:alpha:]:任意大小写字母
    [:alnum:]:任意一个字母或数字
    [:space:]:一个空格
    [:punct:]:标点符号

  • 正则表达式

    这里不具体介绍正则表达式,只是说一下和通配符的区别
    首先通配符没有次数匹配
    *:匹配前面的字符零次或多次
    .:匹配任意一个字符
    :前面的字符零次或一次,基本正则是?
    +:前面的字符至少一次,基本正则是+
    []:和通配符完全一样
    [^]:和通配符一样,但是没有[!]的写法

2 通配符详细介绍
  1. 测试数据

    touch a a6.log abc.log ac.txt b c c5.txt x.log A

  • * 代表任意多个字符
    例:查询以 .log 结尾的文件 ll *.log

  • ? 代表任意单个字符
    例:只查询 a、b、c ll ?

  • [] 代表 [] 之间的某一个字符,比如[0-9]可以代表0-9之间的任意一个数字,[a-zA-Z]可以代表a-zA-Z之间的任意一个字母,字母区分大小写。
    例:只查询字母文件 ll [a-zA-Z]
    例:查询以 .log 结尾且 .log 前只有两个字符的文件且第二个字符是数字 ll ?[0-9].log

  • ^ 表示匹配结果取反的意思,注意这个通配符必须要在[]中使用
    例:查询不是以 .txt 结尾的文件 ll *[^txt]*

  • {} 表示符合括号内包含的多个文件
    例:查询.log.txt 结尾的文件 ll {*.log,*.txt}
    注意: .这个符合比较特殊,如果匹配的条件加上了该符合那么说明查询结果文件就包含带.的文件
    例如前面的^的例子,如果我这样查询ll *.[^txt]*,那么结果就不一样了

  1. 删除操作
    例如:删除a、b、c和以.txt结尾的文件
    rm -f {[abc],*.txt}
    当然既然可以查询当然也可以使用通配符匹配的方式进行移动文件,如果需要在存在很多文件的文件夹中移动某些类型的文件那么使用通配符匹配的效率就显而易见了;当时通配符的使用技巧不单单只有这些,有空的可以多去研究。
3 实例

* 匹配文件名中的任何字符串,包括空字符串。
匹配文件名中的任何单个字符。
[...] 匹配[ ]中所包含的任何字符。
[!...] 匹配[ ]中非感叹号!之后的字符。和^的效果一样

如:
5* 5开头的所有字符串
*5 5结尾的所有字符串
*5? 以5为倒数第二个字符的字符串
[0-9] 所有以数字的字符
[1,2] 1或者2
[!0-9] 不是数字的字符
ls /etc/[!a-n]*.conf 列出/etc/目录中不是以字母a到n开头的,并且以.conf结尾的文件
ls /etc/[a-n]*.conf 列出/etc/目录中以字母a到n开头的,并且以.conf结尾的文件
ls /bin/[ck]* 列出以 c或k开头的文件名

4 正则表达式详细介绍

正则表达式(也称为“regex”或“regexp”)是一种用来描述文本模式的特殊语法。在 Linux 系统上,正则表达式通常被用来查找文本的模式,以及对文本流执行“搜索-替换”操作以及其它功能。

  • 简单字串
    $ grep bash /etc/passwd        
    operator:x:11:0:operator:/root:/bin/bash        
    root:x:0:0::/root:/bin/bash        
    ftp:x:40:1::/home/ftp:/bin/bash 
    

    在上面的命令中,grep 的第一个参数是一个正则表达式;第二个参数是一个文件名。grep 读取 /etc/passwd 中的每一行并对它应用简单子串正则表达式 bash 来查找匹配项。如果找到一个匹配项,那么 grep 打印出整行;否则,忽略该行。

  • 理解简单子串

    一般来说,如果您正在搜索一个子串,那么您可以不提供任何“特殊”字符,而只是逐字地指定文本。只有在子串包含 +.*[]/(在这样的情况下,这些字符需要用引号括起来并在它们的前面使用反斜杠)才需要做特殊的事情。下面是简单子串正则表达式几个其它示例:

      tmp (扫描查找文字串 tmp)        
    “\[box\]”(扫描查找文字串 [box])        
    “\*funny\*”(扫描查找文字串 *funny*)        
    “ld\.so”(扫描查找文字串 ld.so)
    
  • 元字符

    使用正则表达式,可以利用元字符来执行比我们至今已研究过的示例复杂得多的搜索。这些元字符中的一个是 .(点),它与任何单个字符匹配:

    $ grep dev.hda /etc/fstab        
    /dev/hda3 reiserfs noatime,ro 1 1        
    /dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
    /dev/hda2 swap sw 0 0        
    #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1        
    

    在本示例中,文字文本 dev.hda 没有出现在 /etc/fstab 中的任何一行中。但是,grep 扫描这些行时没有查找文字 dev.hda 字符串,而是查找 dev.hda 模式。请记住 . 将与任何单个字符相匹配。正如您看到的,. 元字符在功能上等价于 glob 扩展中 ? 元字符的工作原理。

  • 使用 []

    如果我们希望与比 . 更具体一点地来匹配字符,那么我们可以使用 [ 和 ](方括号)来指定要匹配的字符子集:

    $ grep dev.hda[12] /etc/fstab        
    /dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
    /dev/hda2 swap swap sw 0 0  
    

    [\u4e00-\u9fa5] : 表示任意一个汉字

    正如您看到的,这个特殊语法的作用与glob文件名扩展中的 [] 相同。

  • 使用 [^]

    通过使 [ 后面紧跟一个 ^,您可以使方括号中的意思相反。在本例中,方括号将与未列在方括号内的任意字符匹配。同样,请注意我们在正则表达式中使用 [^] ,而在 glob 中使用 [!] :

    $ grep dev.hda[^12] /etc/fstab        
    /dev/hda3 reiserfs noatime,ro 1 1        
    /dev/hda4 /mnt/extra reiserfs noatime,rw 1 1   
    
  • 区别语法

    注意下面一点很重要:方括号内部的语法根本不同于正则表达式其它部分中的语法。例如,如果在方括号内放置一个 . ,那么它允许方括号与文字 . 匹配,就象上面示例中的 1 和 2。比较起来,除非有\ 作为前缀,否则方括号外面的文字 . 被解释为一个元字符。通过输入如下命令,我们可以利用这一事实来打印 /etc/fstab 中包含文字串 dev.hda 的所有行的列表:
    $ grep dev[.]hda /etc/fstab
    或者,我们也可以输入:
    $ grep "dev\.hda" /etc/fstab
    这两个正则表达式都不可能与您的 /etc/fstab 文件中的任何行相匹配。

  • *元字符

    某些元字符本身不匹配任何字符,但却修改前一个字符的含义。一个这样的元字符是 * (星号),它用来与前一个字符的零次或者多次重复出现相匹配。这里是一些示例:
    ab*c(与 abbbbc 匹配但不与 abqc 匹配)
    ab*c(与 abc 匹配但不与 abbqbbc 匹配)
    ab*c(与 ac 匹配但不与 cba 匹配)
    b[cq]*e(与 bqe 匹配但不与 eb 匹配)
    b[cq]*e(与 bccqqe 匹配但不与 bccc 匹配)
    b[cq]*e(与 bqqcce 匹配但不与 cqe 匹配)
    b[cq]*e(与 bbbeee 匹配)
    .*(与任何字符串匹配)
    foo.*(与以 foo 开始的任何字符串相匹配)
    ac 行与正则表达式 ab*c 相匹配,因为星号也允许前面的表达式 b 出现零次。请注意解释 * 正则表达式元字符所用的方法与解释 * glob 字符的方法根本不同。

  • 行的开始和结束

    我们在这里要详细描述的最后几个元字符是 ^$ 元字符,它们用来分别与行的开始和结束相匹配。通过在正则表达式开始处使用一个 ^ ,您可以将您的模式“锚定”在行的开始。在下面的示例中,我们使用 ^# 正则表达式来与以 # 字符开始的任何行相匹配:

    $ grep ^# /etc/fstab        
    # /etc/fstab: static file system information.        
    #
    
  • 完整行正则表达式

    可以组合 ^$ 来与完整的行相匹配。例如,下面的正则表达式将与以 # 字符开始并以. 字符结束的行相匹配,在其中间可以有任意多个其它字符:

    $ grep '^#.*/.$' /etc/fstab        
    # /etc/fstab: static file system information.  
    

    在上面的示例中,我们用单引号将我们的正则表达式括起来以阻止 shell 解释 $ 。在不使用单引号的情况下,grep 甚至没有机会查看 $$ 就从我们的正则表达式上消失了。

  • 正则总结(转)

    元字符
    . :小数点可以匹配除\n以外的任意一个字符。如果要匹配包括\n在内的所有字符,一般用[\s\S],或者是用.(?s)匹配模式来实现。
    [abc] :匹配方括号中的任意一个字符。可以使用-表示字符范围,如[a-z0-9]匹配小写字母和阿拉伯数字。
    [^abc] :在方括号内开头使用 ^ 符号,表示匹配除方括号中字符之外的任意字符。 | : 表示或
    \d 匹配阿拉伯数字,等同于[0-9]
    \D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
    \x 匹配十六进制数字,等同于[0-9A-Fa-f]
    \X 匹配十六进制数字,等同于[^0-9A-Fa-f]
    \w 匹配单词字母,等同于[0-9A-Za-z_]
    \W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
    \t 匹配<TAB>字符。
    \s 匹配空白字符,等同于[ /t]
    \S 匹配非空白字符,等同于[^ /t]
    \a 所有的字母字符. 等同于[a-zA-Z]
    \l 小写字母 [a-z]
    \L 非小写字母 [^a-z]
    \u 大写字母 [A-Z]
    \U 非大写字母 [^A-Z]

  • 表示数量的元字符

    元字符 说明
    * 匹配 0-任意个
    \+ 匹配 1-任意个
    \? 匹配 0-1个
    \{n,m\} 匹配 n-m个
    \{n\} 匹配 n个
    \{n,\} 匹配 n-任意个
    \{,m\} 匹配 0-m个

  • 换行符 说明
    \r,\n 回车和换行
    \\ 匹配\
    \^,\$,\. 匹配^ $ .
    以下字符在匹配其本身时,通常需要进行转义。在实际应用中,根据具体情况,需要转义的字符可能不止如下所列字符 : $ ^ { [ ( | ) * + ? \
    表示位置的符号
    $ 匹配行尾
    ^ 匹配行首
    \< 匹配单词词首
    \> 匹配单词词尾
    \b 匹配单词边界

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 通配符 与 正则表达式 的区别与详解 的相关文章

随机推荐

  • 新印的钞票如何流入市场?

    原文地址 http zhidao baidu com question 136634468 html 印钞厂一直在印钞票 那市场上的钞票总量一直会增加 这些新印的钞票是怎么流入市场的呢 我看到另一个和我这个相似的问题的回答是 国家通过给公务
  • kali 重置root密码

    kali版本 kali linux 2021 2 但是其他版本也都一样的操作 方法 步骤 第一步 点击开启此虚拟机 打开安装好的kali虚拟机 第二步 进入开机启动页面 按键盘e键进入Kali GNU GRUB页面 进入GNU GRUB页面
  • QTcpSocket::connectToHost内存泄漏的问题

    使用QTcpSocket上网看博客时 发现有篇抄来抄去的博客提到QTcpSocket类的方法connectToHost会泄露内存 即使把调用这个方法的QTcpSocket实例delete掉 内存也不会释放 反复connectToHost会导
  • 树莓派开启 wifi 热点

    树莓派小巧的体型当然不是为了固定放在桌子上 更是为了做成可移动的智能设备 例如智能小车 当树莓派不在室内的 wifi 下时 怎样方便地连接上它呢 于是想要把树莓派变成 wifi 热点 就能用我们的手机或者笔记本连接它了 一 修改 etc n
  • 蓝牙Mesh中的Heartbeat和Heartbeat Publication

    Heartbeat 在蓝牙Mesh网络中 Heartbeat 心跳 是一种用于监测设备在线状态和网络连通性的机制 它是由每个设备定期发送的小型消息组成 用于指示设备的存在和活动状态 Heartbeat的主要目的是确保网络中的设备处于活动状态
  • js实现---加油站问题(贪心算法)

    加油站问题 贪心算法 基本要素 贪心选择 在对问题求解时 总是做出在当前看来是最好的选择 也就是说 不从整体最优上加以考虑 他所做出的是在某种意义上的局部最优解 最优子结构 当一个问题的最优解包含其子问题的最优解时 称此问题具有最优子结构性
  • 树形结构互转

    树形结构互转 1 线性转树形 lineToTree list const list list map e gt id e id pid e parentId label e name raw e const addChild arr obj
  • TPE原理总结

    hyperopt TPE 在hyperopt tpe py 935 处打一断点 5 超参的取值 3 loss的取值 GMM1 GMM1 lpdf len dict literal broadcast best getitem sub arr
  • 三星s9系统更新无法连接服务器,三星 S9/S9+ 手机开始推送 One UI 2.1 系统固件更新...

    IT之家6月15日消息 外媒SamMobile报道 三星Galaxy S9和Galaxy S9 现在正在获取其最新的重大更新OneUI 2 1 今天开始在韩国和德国版三星S9 S9 中推送 上一周 德国版Galaxy Note9手机开始推送
  • Linux拷贝U盘文件(命令行)

    Linux系统有的有界面 有的没有只要命令窗口 因此导入外部文件就变得困难 没有可视化的方便 这里通过挂载u盘进行文件拷贝 首先挂载u盘 这里以centos为例 1 进入命令行模式下 输入命令 sudo i 获取root权限 2 mkdir
  • sqli-labs-master第13、14关。

    前言 输入内容被放到双引号中 报错型注入 注释符不可用 第十三关 http 192 168 89 134 sqli labs master Less 13 先输入 admin 我们还是分析一下 我们接着用and来测试 admin and 1
  • windows下tensorflow CUDA_ERROR_ILLEGAL_ADDRESS解决办法

    最近在使用tensorflow的时候出现了以下所示的bug 2017 11 08 12 24 52 838039 E tensorflow stream executor cuda cuda driver cc 1080 failed to
  • Spring事务回滚报错:org.springframework.transaction.UnexpectedRollbackException

    具体异常信息 Transaction rolled back because it has been marked as rollback only 出现了不可预知的回滚异常 因为事务已经被标志位只能回滚 所以事务回滚了 java lang
  • 视图的优点与缺点

    视图的优点 一 视图着重于特定数据 视图可以让用户或者程序开发人员只看到他们所需要的数据 而不需要把表中的所有信息与字段暴露出来 这样增强了数据的安全性 二 简化数据的操作 易维护 我们可以将经常用到的多表联合查询出来的数据 或特定的结果集
  • python django 环境搭建

    一 版本选择 Django 1 5 x 支持 Python 2 6 5 Python 2 7 Python 3 2 和 3 3 Django 1 6 x 支持 Python 2 6 X 2 7 X 3 2 X 和 3 3 X Django
  • 学习了解jboss7

    1 什么是J2EE J2EE是Java 2enterprise edition 是Java的一种企业版 用于企业级的应用服务开发 J2SE是Java 2standard edition 是Java的标准版 用于标准的应用开发 J2ME是Ja
  • mysql-8.0.32 数据库的安装 (Linux)

    Linux 中 mysql 8 0 32 数据库的安装 缘 步骤 常见问题解决方案 问题一 mysql error while loading shared libraries libtinfo so 5 cannot open share
  • java spring jdbc配置

    整理了一下java spring框架的jdbc 首先说明一下这个jdbc是在myeclipse下配置的 适合初学者 第一步我们在myeclipse下建立一个web项目 然后右击 项目名称 鼠标移动到 myeclipse 下 然后再移动到右边
  • 自动化运维:Ansible脚本之playbook剧本

    目录 一 理论 1 playbooks 2 YAML 3 使用ansible批量安装apache服务 4 定义 引用变量 5 指定远程主机sudo切换用户 6 when条件判断 7 迭代 8 Templates 模块 9 tags 模块 1
  • Linux 通配符 与 正则表达式 的区别与详解

    阅读目录 1 扫盲 2 通配符详细介绍 3 实例 背景 在linux使用过程中 经常需要查找文件 对命令中的通配符 pattern 和正则表达式的区分不是很清楚 有必要好好研究一下 1 扫盲 1 1 通配符和正则表达式 当在使用命令行时 有