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.bak3. 创建多个目录
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.hqwc.cn/news/211343.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中在一个cpp文件中引用另外一个cpp文件的方法

C中在一个cpp文件中引用另外一个cpp文件 可以通过导入cpp文件或者.h文件来实现&#xff0c; 类似python中的import 导入 下面距离说明下 创建1个func1.cpp 内容如下&#xff1a; #include<iostream> using namespace std;int sum (int num1, int num2) {return (num1…

shell 条件语句 if case

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 &#xff08;全真才为真&#xff09; 或 &#xff08;一真即为真&#xff09; 常见条件 双中括号 [[ expression ]] 用法 &…

测试开发(二) 开发chrome插件,提升测试效率

chrome插件截图 功能说明 自定义拦截请求response数据、并根据需要做解析&#xff0c;方便检查数据&#xff0c;提升测试效率。 chrome插件截图 功能说明 自定义修改请求的header、接口返回的response的header&#xff0c;提升模拟请求的效率&#xff0c;进而提升测试效率。…

tp8 使用rabbitMQ(4)路由模式

路由模式 在第三节中我们使用的 交换机的 fanout 把生产者的消息广播到了所有与它绑定的队列中处理&#xff0c;但是我们能不能把特定的消息&#xff0c;发送给指定的队列&#xff0c;而不是广播给所有队列呢&#xff1f; 如图&#xff0c;交换机把 orange 类型的消息发送给了…

七要素微气象仪气象数据监测助手

WX-WQX7 随着科技的发展&#xff0c;气象预测的准确性已成为人们日常生活的重要参考。而七要素微气象仪&#xff0c;作为新型的气象探测设备&#xff0c;以其精细化的数据测量和解析能力&#xff0c;正在改变我们的天气预测方式。 一、产品介绍 七要素微气象仪是一款集成了温…

从裸机启动开始运行一个C++程序(十三)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;十二&#xff09; 从裸机启动开始运行一个C程序&#xff08;十一&#xff09; 从裸机启动开始运行一个C程序&#xff08;十&#xff09; 从裸机启动开始运行一个C程序&#xff08;九&#xff09; 从裸机启动开…

【IEEE-TRANS】CCF-B类,IF:11+, 1区顶刊,无需版面费,最快2个月左右录用!

论文写作堪比西天取经&#xff0c;当我们经历“九九八十一难&#xff0c;取得真经“&#xff0c;还有最关键的一步&#xff0c;就是选刊发表。是“投石问路”&#xff0c;还是“投其所好”&#xff1f; 选刊有多重要&#xff0c;相信只要有过发表SCI经验的人都十分清楚。如果不…

每天5分钟复习OpenStack(十)Ceph 架构

1、Ceph是什么&#xff1f; “Ceph is a unified, distributed storage system designed for excellent performance, reliability and scalability.”这句话说出了Ceph的特性&#xff0c;它是可靠的、可扩展的、统一的、分布式的存储系统。Ceph可以同时提供对象存储RADOSGW&am…

OSG动画与声音-路径动画之导出与导入(2)

路径的导出示例 路径的导出示例的代码如程序清单10-2所示。 1. // 创建路径 2. osg::ref_ptr<osg::AnimationPath> createAnimationPath(osg::Vec3 ¢er, 3. float radius, float looptime) 4. { 5. // 创建一个Path对象 6. osg::ref_ptr<…

AndroidNDK开发之交叉编译

在Android studio2.2以及以上&#xff0c;构建原生库的默认工具是cmake。 CMake是一个跨平台的构建工具&#xff0c;可以使用简单的语句来描述所有平台的安装(编译过程)。 能够输出各种各样的makefile或者project文件。cmake并不直接构建出最终的软件&#xff0c;而是产生其他工…

《微信小程序开发从入门到实战》学习二十六

3.4 开发参与投票页面 参与投票页面同样需要收集用户提交的信息&#xff0c;哪个用户在哪个投票选择了什么选项&#xff0c;因此它也是一个表单页面 3.4.1 如何获取投票信息 假设用户A在投票创建页面后填了表单&#xff08;1.创建投票&#xff09;&#xff0c;用户A 点了提交…

合并两个有序链表,剑指offer,力扣

目录 力扣题目地址&#xff1a; 原题题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff1a; 具体流程如下&#xff1a; 代码实现&#xff1a; 知识补充&#xff1a; 力扣题目地址&#xff1a; 21. 合并两个有序…