Shell 通配符与正则表达元字符

regex-1

Author:rab


目录

    • 前言
    • 一、通配符
      • 1.1 *
      • 1.2 ?
      • 1.3 []
      • 1.4 {}
    • 二、正则表达元字符
      • 2.1 *
      • 2.2 .
      • 2.3 ^
      • 2.4 $
      • 2.5 []
      • 2.6 \
      • 2.7 \<\>
      • 2.8 \{\}
    • 总结


前言

不管是学任何语言,几乎都会涉及到通配符与正则的使用。有时候对于 Linux 初学者来说,往往会将通配符正则表达搞混了。今天,我们来仔细研究一下 Linux 中通配符与正则元字符之间的细微区别。

一、通配符

在 Shell 中,通配符常用于文件名或路径名匹配的特殊字符,以下是一些常见的 Shell 通配符。

1.1 *

1、功能

匹配任意字符零次或多次。

2、案例

# 列出/opt/jdk目录下所有以.html结尾的所有文件
[root@base ~]# ll /opt/jdk/*.html

image-20231123121140996

# 列出/opt目录下所有以j字母开头的目录名下的所有内容
[root@base ~]# ll /opt/j*

image-20231123120843867

1.2 ?

1、功能

匹配任意单个字符,即只能匹配单个字符,且必须要匹配一个。

2、案例

# 列出/opt/jdk/目录下开头是READM结尾是.html,且在这开头和结尾之间只有任意一个字符的文件
# 比如下面案例就能匹配到:README.html、READMq.html、READMH.html等满足要求的文件
[root@base ~]# ll /opt/jdk/READM?.html

image-20231123121850675

1.3 []

1、功能

匹配指定范围内的字符,如 [0-9] 匹配任意数字。

2、案例

# 创建两个测试文件
[root@base opt]# touch 1.txt 22.txt
# 匹配数字开头的文件
[root@base opt]# ll [0-9]*

image-20231123122900941

# 匹配数字开头的文件(此时只能是单个数字开头的才能被匹配到)
[root@base opt]# ll [0-9].txt

image-20231123122933828

1.4 {}

1、功能

用于生成花括号内的字符串模式的所有可能组合,用逗号隔开。如:{1,22}.txt 匹配 1.txt 或 22.txt 文件。要注意的是 {} 中至少有两个匹配对象,否则会报错,具体看下图。

2、案例

# 查看(匹配)1.txt与22.txt文件

image-20231123123453004

# 其他案例

1.复制多个文件
cp file{1,2,3}.txt destdir/  # 该命令会复制 file1.txt、file2.txt 和 file3.txt 到目标目录destdir下

2.重命名文件
mv oldfile{,.bak}            # 该命令会将 oldfile 重命名为 oldfile.bak

3. 创建多个目录
mkdir {dir1,dir2,dir3}       # 该命令会创建 dir1、dir2 和 dir3 三个目录

4.数字范围
touch file{1..5}.txt         # 该命令将会创建 file1.txt 到 file5.txt 五个文件

5.生成组合文件
echo {aa,bb}_{cc,dd}.txt     # 该命令将会生成aa_cc、aa_dd、bb_cc、bb_dd四种组合文件(注意下划线不是非必须的)

image-20231123134718863

二、正则表达元字符

正则表达用于更通用的文本模式匹配,可以在文本中查找、匹配和提取特定的模式。

2.1 *

1、功能

匹配 * 前一个字符 0 次或多次,如:she*ll,就表示匹配 e 字符 0 次或多次重复,如 shll、shell、sheel、sheeeel 等。

2、案例

# 匹配字符a零次或重复多次
b     # 它能匹配是因为满足了匹配字符a零次
ab    # 它能匹配是因为满足了匹配字符a一次
aab   # 它能匹配是因为满足了匹配字符a重复两次

image-20231123142208955

那正则中的 * 如何像通配符中的 * 匹配任意呢?采用 .* 即可,. 接下来会讲到。

ls | grep 'file.*\.txt'

# 该命令会列出当前目录中所有以 "file" 开头,后面跟着任意字符,然后是 ".txt" 结尾的文件。
# 如file.txt、filexsd.txt、fileodcfrgop.txt等文件均会被匹配
# 为什么会这样呢?因为.表示匹配任意单个字符,然后*又表示匹配其前面字符(即.)0次或重复多次
# 所以在正则中.*就相当于,没有()、一个点(.)、两个点(..)、三个点(...)、以此类推。

2.2 .

1、功能

用于匹配任意单个字符,如:..6. 表示前面两个字符可为任意单个字符,第四个字符也为单个任意字符,如 aa6k、So68 等均能匹配。

2、案例

# 匹配文件中满足的所有内容,如下图,被匹配的部分会被标红

image-20231123144053709

2.3 ^

1、功能

用于匹配行首,表示行首的字符是 ^ 后面的那些字符,如:^rab 表示匹配以 rab 字符开头的所有行。

2、案例

# 匹配file.txt文件中内容所有以ab开头的行(说白了被匹配到的都会被标红)

image-20231123144543007

2.4 $

1、功能

用于匹配行尾,表示行尾的字符是 $ 前面的那些字符,如:rab$ 表示匹配以 rab 字符结尾的所有行。

2、案例

grep 'ab$' file.txt

常用:匹配空白行

grep '^$' file.txt      # ^$表示匹配file.txt文件的所有空白行
grep -v '^$' file.txt   # -v选项表示取反,即过滤掉file.txt文件中的空白行

2.5 []

1、功能

用于匹配字符合集,即匹配中括号中的某个字符。如:

  • [xyz]:将会匹配字符 x、y 或 z 单个字符。
  • [a-z]:将会匹配字符 a~z 之间的任意单个字符(包括 a 和 z)。
  • [a-zA-Z]:将会匹配小写字符 a~z 之间或大写字符 A~Z 之间的任意单个字符(包括 a/A 和 z/Z)。
  • [a-z0-9]:将会匹配小写字符 a~z 之间或数字0~9之间的任意单个字符。
  • [^a-z]:在 [] 中的 ^ 符号表示取反,即匹配除了小写字符 a~z 之外的任意单个字符。
  • [][][]:多个 [] 组合能够匹配一般的单词或数字,如:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] 就可以匹配我们的手机号(即任意 11 位纯数字的组合)。

2、案例

image-20231123150328070

这种正则匹配的组合与我们通配符的 {} 组合功能相似。

2.6 \

1、功能

实现转义,什么是转义,顾名思义:即改变原本内容的含义。比如,\^\$ 等,原本在正则中 ^ 表示匹配以 xxx 开头的行,$ 表示以 xxx 结尾的行。那如果被我们使用 \ 进行转义后,就不再具备正则中以xxx开头以xxx结尾的原本含义了,而仅仅就是字面上所见的原生符号(而不具备任何意义,仅作为一个单纯的占位字符),当我们对某些没有意义的特殊符号进行转义时,也会使这些没有意义的特殊符号具备一定的意义。

2、案例

# 即使具备有意义的字符转义为无意义的字符

image-20231123151349468

注意:转义符 \ 仅转义与它相邻的那个原字符。

2.7 <>

1、功能

该正则表达使用转义符号 \ 来表示,将没有任何意义的 < 符号进行转义后, < 符号就具备了一定意义了。因此 \<rab\> 就表示完整匹配整个单词 rab。

2、案例

# 仅仅匹配有rab单词的行,即使其他行也有rab关键字,但也不会被匹配,因为其他行的rab与其他字符相邻了

image-20231123152400084

# 继续看下面案例,当我的rab关键字与其他字符不相邻时就可以被匹配

image-20231123153112940

2.8 {}

1、功能

同样是通过转义字符 \ 来转义,用于表示前一个字符的重复此时,此时有以下几种情况:

  • \{n\}

    匹配 {} 前面的字符 n 次,如:ra\{3\}b 匹配 raaab

  • \{n,\}

    匹配 {} 前面的字符至少 n 次,如:ra\{3,\}b 匹配 raaabraaaaaab 等。

  • \{n,m\}

    匹配 {} 前面的字符 n 次与 m 次之间,如:ra\{3,6\}b 匹配 raaabraaaaaab 等。

2、案例

# 比如匹配文件中的手机号(如下图)
# 为什么会匹配到手机号呢?因为{}会先匹配其前面的字符[]11次,而每次都是[0-9]
# 相当于:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]的效果

image-20231123154058777

注意:你会发现,通配符和正则表达元字符都有 * 号,那这两个符号怎么区分呢?其实这两个是相辅相成的,如果满足通配符表达则匹配,如果满足正则表达则匹配,如果同时满足通配和正则表达则均匹配,如下案例。

image-20231123141441133

总结

在使用时,需要根据具体的需求选择合适的匹配方法。在 Shell 脚本中,通常会使用通配符,而在需要更复杂模式匹配的文本处理场景中,则会使用正则表达式。

—END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/180910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust使用iced构建UI时,如何在界面显示中文字符

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 iced的基本逻辑是&#xff1a; UI交互产生消息message&#xff0c;message传递给后台的update&#xff0c;在这个函数中编写逻辑&#xff0c;然后通过…

轻松记录收支明细,一键打印,财务无忧!

作为现代人&#xff0c;管理好个人财务是非常重要的。但是&#xff0c;如何记录收支明细并打印出来呢&#xff1f;今天&#xff0c;我们向您推荐一款财务软件&#xff0c;帮助您轻松解决这个问题。 首先第一步&#xff0c;我们要打开【晨曦记账本】&#xff0c;并登录账号。 第…

Delphi 12 Athens 发布了!

官方安装包 ☞ https://altd.embarcadero.com/download/radstudio/12.0/RADStudio_12_0_4915718.iso 安装辅助工具、控件可以戳这里 &#xff1a;Delphi 12 资源 RAD Stuido 12 Athens &#xff0c;这次更新的细节还是比较多的&#xff0c;但主要还是多端&#xff08;iOS、An…

BMS基础知识:BMS基本功能,铅酸和锂电池工作原理,电池系统的重要概念!

笔者有话说&#xff1a; 作为BMS从业者来讲&#xff0c;目前接触的BMS系统并不是很高大尚&#xff0c;但基础功能都是有的。 关于BMS的基本功能&#xff0c;工作原理&#xff0c;运行逻辑等&#xff0c;在此做一个梳理&#xff0c;讲一些最基础的扫盲知识&#xff0c;可以作为…

微服务 Spring Cloud 9,RPC框架,客户端和服务端如何建立网络连接?

目录 一、客户端和服务端如何建立网络连接&#xff1f;1、HTTP通信2、Socket通信 二、服务端如何处理请求&#xff1f;1、通常来说&#xff0c;有三种处理方式&#xff1a;2、不同的处理方式对应着不同的业务场景&#xff1a; 三、HTTP协议传输流程四、数据该如何序列化和反序列…

浅谈安科瑞智能照明系统在马来西亚国家石油公司项目的应用

摘要&#xff1a;随着社会经济的发展及网络技术、通信技术的提高&#xff0c;人们对照明设计提出了新的要求&#xff0c;它不仅要控制照明光源的发光时间、 亮度&#xff0c;而且与其它系统来配合不同的应用场合做出相应的灯光场景。本文介绍了马亚西亚石油公司智能照明项目的应…

2023.11.22 IDEA Spring Boot 项目热部署

目录 引言 操作步骤 1. 在 pom.xml 中添加热部署框架支持 2. Setting 开启项目自动编译 3. 以后创建的新项目进行同步配置 4. 重复 配置 步骤2 的内容 5. 开启运行中的热部署 引言 Spring Boot 的热部署是一种在项目正在运行的时候修改代码&#xff0c;却不需要重新启动…

无线电通信常见的12种天线

天线&#xff0c;作为无线通信系统的重要组成部分&#xff0c;有着不可替代的作用。 在我们的生活中&#xff0c;有很多类型的通信需求&#xff0c;例如长距离通信、短距离通信、卫星通信、微波通信、手机通信、点对点通信、点对面通信等等。 使用卫星电话进行通信 不同的需求&…

【高级程序设计】django与网页设计

django安装与配置 使用pip进行Django的安装: pip install djangoconda install django验证django安装成功 import django django.__version__ ## django.get_version()新建一个名称为blog的django项目(project), D:\>cd web-project D:\web-project>django-admi…

亚马逊防关联要注意什么?看这一篇,防关联有技巧!

亚马逊账号关联的问题&#xff0c;对于跨境电商来说都不陌生&#xff0c;店铺的安全问题往往和账号关联有关&#xff0c;一旦亚马逊账号被关联就很可能导致我们的店铺被封&#xff0c;对于被亚马逊封店的卖家都会有申诉机会&#xff0c;如果无法成功申诉&#xff0c;那将永久被…

政务大数据与资源平台建设解决方案:PPT全文75页,附下载

关键词&#xff1a;智慧政务解决方案&#xff0c;大数据解决方案&#xff0c;数据中心解决方案&#xff0c;数据治理解决方案 一、政务大数据与资源平台建设背景 1、政务大数据已成为智慧城市建设的必要基础 为响应国家不断加快5G基建、大数据、人工智能等新型基础设施建设布…

生命周期评估(LCA)与SimaPro碳足迹分析

SimaPro提供最新的科学方法和数据库以及丰富的数据&#xff0c;使您可以收集和评估产品和流程的环境绩效。通过这种方式&#xff0c;您可以将改变公司产品生命周期的想法提交给您的同事&#xff0c;以便阐明您的业务未来。 SimaPro软件的特点和功能&#xff1a; 完全控制产品生…

oracle数据库巡检常见脚本-系列三

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…

时间复杂度 空间复杂度 ---java

目录 一. 算法效率 二.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 三. 空间复杂度 一. 算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率 。 时间效率被称为时间复杂度&#xff0c;而空间…

基于 Flink CDC 打造企业级实时数据集成方案

本文整理自Flink数据通道的Flink负责人、Flink CDC开源社区的负责人、Apache Flink社区的PMC成员徐榜江在云栖大会开源大数据专场的分享。本篇内容主要分为四部分&#xff1a; CDC 数据实时集成的挑战Flink CDC 核心技术解读基于 Flink CDC 的企业级实时数据集成方案实时数据集…

算法复杂度分析

文章目录 有数据范围反推算法复杂度以及算法内容一般方法递归 有数据范围反推算法复杂度以及算法内容 c一秒可以算 1 0 7 10^7 107~ 1 0 8 10^8 108次 一般方法 看循环 有几层循环就可以初步分析O( n i n^i ni) 双指针算法除外O(n) 递归 公式法 根据公式的形式&#xff0…

痤疮分级实验笔记-ResNet

组织数据集 方式1&#xff1a;根据txt文件分类的数据集组织形式&#xff08;放弃&#xff09; 你可以使用Python来读取txt文件中的训练集图片信息&#xff0c;并将这些图片从原始文件夹复制到目标文件夹中。 当程序无法找到标签对应的图片或者目标文件夹中已经存在同名图片时…

技术细分|推荐系统——推荐系统中的数据去偏方法

本篇的主要脉络同样依据中科大何向南教授、合工大汪萌教授联合在 TKDE 上的一篇综述文章展开&#xff1a;Bias and Debias in Recommender System: A Survey and Future Directions。 下面按照前导文章中介绍的数据偏差 Selection Bias、Conformity Bias、Exposure Bias、Posit…

洛谷P1036 [NOIP2002 普及组] 选数【回溯搜索+素数】

P1036 [NOIP2002 普及组] 选数 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题目分析注意事项 代码后话王婆卖瓜 题目来源 前言 期中考逆天大作业&#xff0c;都快没时间写了。不过还是得抽空写一下题目&#xff0c;今天还是做搜索的题单&#xff0c;一题…

【0基础学Java第十一课】-- 认识异常

11. 认识异常 11.1 异常的概念与体系结构11.1.1 异常的概念11.1.2 异常的体系结构11.1.3 异常的分类 11.2 异常的处理11.2.1 防御式编程11.2.2 异常的抛出 throw11.2.3 异常的捕获异常声明throwstry-catch捕获并处理finally问题&#xff1a;既然 finally 和 try-catch-finally …