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

news2024/11/14 20:56:15

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线上问题排查实例分析|关于 Redis 内存泄漏

Redis 作为高性能的 key-value 内存型数据库&#xff0c;普遍使用在对性能要求较高的系统中&#xff0c;同时也是滴滴内部的内存使用大户。本文从 KV 团队对线上 Redis 内存泄漏定位的时间线维度&#xff0c;简要介绍 Linux 上内存泄漏的问题定位思路和工具。 16:30 问题暴露 业…

gitt开源项目的意义,公司为什么会对在gitt上有开源项目的人更大机会

Git是一种分布式版本控制系统&#xff0c;它可以帮助程序员管理代码的历史版本和协同工作。同时&#xff0c;Git也成为了开源项目的主要托管平台之一。Git的开源项目意义重大&#xff0c;因为这种开源项目托管平台可以帮助开发者将代码和项目分享给全球的开发者&#xff0c;并且…

linux网络之网络层与数据链路层

文章目录 一、网络层 1.IP协议 2.IP协议头格式 3.网段划分 4.特殊ip地址 5.IP地址的数量限制 6.私有ip和公网IP 7.路由 二、数据链路层 1.以太网 2.以太网帧格式 3.MAC地址 4.对比理解MAC地址和IP地址 5.MTU 6.ARP协议 ARP协议的工作流程 ARP数据报的格式 7.DNS 8.ICMP协议 9.N…

从六个方面对比Go和Python的差异

您是否想过 Go 与 Python 之间的主要区别是什么&#xff1f;随着对软件开发人员的需求不断增加&#xff0c;选择哪种编码语言可能会很困难。 ​ 在此&#xff0c;我们将从六个方面对比Go和Python,探讨 Go 和 Python之间的差异。我们将讨论它们的特点、优缺点&#xff0c;以便…

mongodb数据库的常用操作语句

说在前面的话 本文所有的操作示例&#xff0c;都以集合“HistoryTaskBase”为例。 一、查询 1、时间区间 查询“通知时间”介于2019-09-01到2019-10-01之间的数据。 db.getCollection(HistoryTaskBase).find({notifyTime:{$gte:ISODate(2019-09-01T00:00:00.000Z),$lte:ISOD…

Nginx:简介、安装与部署

一、Nginx简介 Nginx是一个很好的高性能Web和反向大力服务器&#xff0c;它具有很多非常优越的特性&#xff1a;在高连接并发的情况下&#xff0c;Nginx是Apahe服务器的不错的替代品&#xff1a;Nginx在美国是虚拟主机生意选择的软件平台之一。能够支持50000个并发连接数的响应…

《洛谷深入浅出基础篇》P4017最大食物链————拓扑排序

上链接&#xff1a;P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4017 上题干&#xff1a; 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是…

高质量短效SOCKS5代理IP是什么意思?作为技术你了解吗

小张是一位网络安全技术测试员&#xff0c;最近他接到了一个头疼的任务&#xff0c;那就是评估公司系统的安全性&#xff0c;因此他前来咨询&#xff0c;在得知SOCKS5代理IP可以帮他之后&#xff0c;他不禁产生疑问&#xff0c;这是什么原理&#xff1f;其实和小张一样的朋友不…

ELK企业级日志分析平台——kibana数据可视化

部署 新建虚拟机server5&#xff0c;部署kibana [rootelk5 ~]# rpm -ivh kibana-7.6.1-x86_64.rpm [rootelk5 ~]# cd /etc/kibana/[rootelk5 kibana]# vim kibana.ymlserver.host: "0.0.0.0"elasticsearch.hosts: ["http://192.168.56.11:9200"]i18n.local…

嵌入式开发从入门到入土

写在前面的话 嵌入式开发涉及的层面很广&#xff0c;它既有底层硬件的开发&#xff0c;又涉及上层应用的开发&#xff0c;也就是所谓的系统集成的硬件和软件。而C语言不仅具有汇编语言操作底层的优势&#xff0c;又具有高级开发语言的功能性强的特点&#xff0c;当之无愧地成为…

JavaScript框架 Angular、React、Vue.js 的全栈解决方案比较

在 Web 开发领域&#xff0c;JavaScript 提供大量技术栈可供选择。其中最典型的三套组合&#xff0c;分别是 MERN、MEAN 和 MEVN。前端框架&#xff08;React、Angular 和 Vue&#xff09;进行简化比较。 MERN 技术栈详解 MERN 技术栈包含四大具体组件&#xff1a; MongoDB&am…

保姆级 Keras 实现 YOLO v3 一

保姆级 Keras 实现 YOLO v3 一 一. YOLO v3 总览二. 特征提取网络特征提取网络代码实现 三. 特征融合特征融合代码实现 四. 网络输出模型输出代码实现 五. 网络模型代码实现六. 代码下载 如果要给 YOLO 目标检测算法一个评价的话, 就是快和准, 现在已经到了 v8, 但是我为什么还…

前端环境变量释义process.env与import.meta.env

视频教程 彻底搞懂前端环境变量使用和原理&#xff0c;超清楚_哔哩哔哩_bilibili 添加命令行参数 --modexxxxx 新建.env.xxxx文件,其中.env文件会在所有环境下生效 以VITE_开头&#xff0c;字符串无需加双引号 使用import.meta.env.VITE_xxxxx进行调用

JavaScript基础—引入方式、注释和结束符、输入和输出、变量、常量、数据类型、检测数据类型、类型转换、综合案例—用户订单信息

版本说明 当前版本号[20231123]。 版本修改说明20231123初版 目录 文章目录 版本说明目录JavaScript 基础 - 第1天介绍引入方式内部方式外部形式 注释和结束符单行注释多行注释 结束符输入和输出输出输入 变量声明赋值变量初始化更新变量 关键字变量名命名规则 常量数据类型…

2023年11个最佳免费WordPress主题

如果您刚刚开始使用 WordPress&#xff0c;您可能会很自然地认为&#xff0c;只要免费的WordPress主题看起来像您想要的网站主题&#xff0c;那么它就很合适。不幸的是&#xff0c;事情并没有那么简单。这就是为什么在今天的文章中&#xff0c;我们概述了一份可靠的标准清单&am…

投资房产的理由与好处,投资买房的方法与技巧

一、教程描述 本套买房教程&#xff0c;大小2.15G&#xff0c;共有23个文件。 二、教程目录 00.她23岁北漂月薪600&#xff0c;7年后50万在京买了第一套房&#xff0c;如今身价上千万.mpg 01.这个游戏&#xff0c;有些人输了所有钱&#xff0c;一辈子也不明白这个道理.mpg …

脉冲幅度调制信号的功率谱计算

本篇文章是博主在通信等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在通信领域笔记&#xf…

Hibernate批量处理数据

概念&#xff1a; 批量处理数据是指在一个事务场景中处理大量数据。 在应用程序中难以避免进行批量操作&#xff0c;Hibernate提供了以下方式进行批量处理数据&#xff1a; (1)使用HQL进行批量操作 数据库层面 executeUpdate() (2)使用JDBC API进行批量操作 数据库层面 …

P6 C++控制流语句(continue, break, return)

前言 今天我们讲的是控制流语句&#xff0c;本期内容是上期课程的延续。 控制流语句一般与循环语句一起工作&#xff0c;它们让我们可以更好的控制这些循环的实际运行。 我们有三个主要的控制流语句可以使用&#xff0c;continue 、break 和 return&#xff0c;它们有不同的…

Nginx模块开发之http handler实现流量统计(1)

文章目录 一、handler简介二、Nginx handler模块开发2.1、示例代码2.2、编写config文件2.3、编译模块到Nginx源码中2.4、修改conf文件2.5、执行效果 三、Nginx的热更新总结 一、handler简介 Handler模块就是接受来自客户端的请求并产生输出的模块。 配置文件中使用location指令…