04 Shell编程之正则表达式与文本处理器

1、正则表达式

1.1 正则表达式的定义

正则表达式又称为正规表达式、常规表达式。

正则表达式是使用单个字符来描述、匹配一系列符合某个句法规则的字符串,

简单来说,正则表达式就是一种匹配字符串的方法(通过一些特殊符号,实现快速查找、删除、替换某个特定字符串)

注:正则表达式(在代码中常简写为regex、regexp或RE)是由普通字符与元字符组成的文字模式。

普通字符包括大小写字母、数字、标点符号及一些其他符号;

元字符是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符在目标对象中的出现模式。

正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

正则表达式一般用于脚本编程与文本编辑器中。正则表达式具备很强大的文本匹配功能,能够在

文本海洋中快速高效地处理文本。

1.2 正则表达式的用途

由于系统在运行中会产生大量的信息,而这些信息有些是非常重要的,有些仅仅是告知信息。

身为系统管理员如果直接看到这么多的信息数据,就无法快速准确定位到重要的信息。

这时候就可以通过正则表达式快速提取“有问题”的信息。这样就可以使运维工作变得更加简单,方便。

例如,在Internet中,垃圾/广告邮件经常会造成网络塞车,而如果在服务器端就将这些问题邮件提前踢除的话,客户端就会减少很多不必要的带宽消耗。

而目前常用的邮件服务器postfix以及支持邮件服务器的相关分析软件都支持正则表达式的对比功能

(将来信的标题、内容与特殊字符串进行对比,发现问题邮件就过滤掉)

1.3 基础正则表达式

根据不同的严谨程度与功能可将正则表达式分为基本正则表达式、扩展正则表达式。

在Linux系统中,常见的文本处理工具grep与sed支持基本正则表达式;

而egrep与awk支持扩展正则表达式。

1.3.1 基础正则表达式的实验实例

首先需要先准备一个名为test.txt的测试文件,如下图:

完成test.txt文件的填写之后,保存并退出vim编辑器。

(1)查找特定字符

注:-n——表示显示行号;

-i——表示不区分大小写;

执行如下图中的命令,可以在test.txt文件中查找出特定字符the所在的位置(命令执行后,符合匹配条件的字符,字体颜色会变为红色):

若反向选择,可使用grep命令的-v选项来实现。如下图:

补充:grep命令的-v选项,表示反转匹配或排除匹配。即-v选项会输出不匹配指定模式的行,而不是匹配的行。

如果用户想要查找不包含某个特定字符串的行,就可以使用grep -v命令来实现。

(2)利用中括号[]来查找集合字符

中括号[]里无论有几个字符,都仅代表一个字符,也就是说[io]表示匹配i或者o。

例如,执行以下命令就可以同时查找到shirt与short这两个字符串。

若要查找包含重复单个字符oo时,可执行下图中的命令:

补充:若要查找oo前面不是w的字符串,只需要通过集合字符的反向选择[^]来实现该目的。

例如,执行下图中的命令可找到oo前面不是w的字符串:

注:上图中,通过执行后的结果可以查看到,第十二行、第十三行中的#woood#和

#wooooood#,二者前面也包含w,那这是怎么回事呢?不是要把所有oo前面是w的字符行都给过滤掉了吗?

其实,从上图的执行结果中就可以看出来,第十二行的#woood#中加粗显示的是ooo而不是oo。也就是说,oo前面的那个o也是符合规则的,是不能被过滤掉的;

同理,第十三行的#wooooood#中,加粗显示的是oooooo而不是oo。也就是说oo前面的oooo也是符合规则的,是不能被过滤掉的。

若不希望oo前面存在小写字母,可以使用下图中的命令来实现:

注:a-z表示小写字母;A-Z表示大写字母

若希望查找文本中包含数字的行,可以通过下图中的命令来实现:

(3)查找行首“^”与行尾字符“$”

基础正则表达式包含两个定位元字符:^表示行首的意思;$表示行尾的意思

例如,在上面的查询the字符串时出现了很多包含the的行,

如果想要查询以the字符串为行首的行,就可以通过元字符^来实现,如下图:

若要查询以小写字母开头的行,可以使用^[a-z]来过滤,如下图:

若要查询以大写字母开头的行,则可以使用^[A-Z]来过滤,如下图:

若查询不以字母开头的行,则可以使用^[^a-zA-Z]规则来过滤,如下图:

补充:^符号在元字符[]符号内外的作用是不一样的,

在[]符号内——表示反向选择;

在[]符号外——代表定位行首。

若想查找以某一特定字符结尾的行,则可以使用$定位符。

例如,执行下图中的命令,可以查找到以小数点.结尾的行。

补充:因为小数点.在正则表达式里面也是一个元字符,所以需要在这里用转义字符\

将具有特殊意义的字符转化为普通字符。

如果要查询空白行,可执行下图中的命令:

(4)查找任意一个字符.与重复字符*

小数点.在正则表达式中也是一个元字符,代表任意一个字符。

例如,执行下图中的命令就可以查找以w开头以d结尾的字符串,共有四个字符。

*代表的是重复前面的单字符零个或多个。

例如,o*——表示拥有0个或大于等于1个o的字符

(因为允许空字符,所以执行下图中的命令时,会将文本中所有的内容都输出打印)

若是oo*,则第1个o必须存在,第2个o可以是0个或多个。如下图所示:

同理,若是查询包含至少两个o以上的字符串,则执行下面的命令即可:

若想查询以w开头以d结尾,中间至少包含一个o的字符串,可执行下图中的命令:

若想查询以w开头以d结尾,中间字符可有可无的字符串,可执行下图中的命令:

若想查询任意数字所在的行,可执行下图中的命令:

(5)查找连续字符范围{}

如果想要限制一个范围内的重复字符串该如何实现呢?

比如说,要查找三到五个o的连续字符,这时候就需要使用基础正则表达式中限定范围的字符{}了。

注:{}在Shell中具有特殊意义,所以在使用{}字符时,需要利用转义字符\将{}字符转换成普通字符。

下面介绍一下{}字符的使用方法:

查询两个o的字符:

查询以w开头以d结尾,且中间包含2~5个o的字符串:

查询以w开头以d结尾,中间包含2个或2个以上o的字符串:

2、元字符总结

基础正则表达式的元字符主要包括有:

3、扩展正则表达式

grep命令仅支持基础正则表达式,如果要只要扩展正则表达式,需要使用egrep或awk命令。

注:egrep命令是一个搜索文件获得模式,

使用该命令可以搜索文件中的任意字符串和符号,

也可以搜索一个或多个文件的字符串,

egrep命令与grep命令的用法基本相似。

与基本正则表达式类似,扩展正则表达式也包含多个元字符,常见的扩展正则表达式的元字符主要有:

4、文本处理器

grep、sed、awk是Shell编程中经常用到的文本处理工具,被称为Shell编程三剑客。

4.1 sed工具

sed工具是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或仅输出处理的某些行。

注:sed也可以在无交互的情况下实现相当复杂的文本处理操作。

sed的工作流程主要包括读取、执行和显示三个过程:

  • 读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间)
  • 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

注:默认情况下,所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

4.2 sed命令的常见用法

通常情况下,sed命令有两种格式,如下图所示:

注:操作用于对文件操作的动作行为,也就是sed的命令。

常见的sed命令选项主要有:

-e——表示指定命令或者脚本来处理输入的文本文件

-f——表示用指定的脚本文件来处理输入的文本文件

-h——显示帮助

-n——表示仅显示处理后的结果

-i——直接编辑文本文件

常见的操作有:

a——增加,在当前行下面增加一行内容

c——替换,将选定行替换为指定内容

d——删除,删除选定的行

i——插入,在选定的行上面插入一行指定内容

p——打印,

注:如果同时指定行,表示打印指定行;

如果不指定行,则表示打印所有内容;

如果有非打印字符,则以ASCII码输出,其通常与-n选项一起使用

s——替换,替换指定字符

y——字符转换

4.3 sed用法实例

以上面创建的test.txt文件为例,进行演示。

(1)输出符合条件的文本(p——表示正常输出)

若只想输出test.txt文件中的第3行内容,可以执行下列命令:

若向输出test.txt的第3~5行内容,可执行下图中的命令:

若向输出所有的奇数行,可用下图中的命令:

若想输出所有的偶数行,可以执行下图中的命令:

若想输出第1~5行之间的奇数行(第1、3、5行),可以执行下图中的命令:

若想输出第10行至文件结尾之间的偶数行,可执行下图中的命令:

注:在上图中,如果单引号换成双引号使用的话,这时候如果会报错,就要在$前面加上一个转移符才可以。如下图:

(2)sed命令结合正则表达式使用

sed命令结合正则表达式时,格式略有不同。正则表达式以/包围。

例如,若要输出test.txt文件中,包含the的行,可以使用下图中的命令。其中,the要被/包围:

若要输出第4行至第一个包含the的行,可以执行下图中的命令:

若想输出包含the的行所在的行号,可执行下图中的命令:

若想输出test.txt文件中以PI开头的行,可执行下图中的命令:

若想输出以数字结尾的行,可以执行下图中的命令:

若想输出包含单词wood的行,可执行下图中的命令:

注:\< 、\>代表单词的边界

(3)删除符合条件的文本(d)

nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。如下图:

若想删除test.txt文件中的第3行,可以执行下图中的命令:

若想删除第3~5行,可以执行下图中的命令:

若想删除包含cross的行,可以执行下图中的命令:

注:如果要删除不包含cross的行,用!表示取反操作。如下图:

若要删除以小写字母开头的行,可以执行下图中的命令:

若要删除以.结尾的行,可执行如下图的命令:

若要删除所有的空行,可以执行下图中的命令:

(4)替换符合条件的文本

在使用sed命令进行替换操作时,需要用到s(字符串替换)、c(整行/整块替换)、y(字符转换)这些命令选项。

若想将每行中的第一个the替换为THE,可以执行下图中的命令:

若想将每行中的第2个l替换为L,可以执行下图中的命令:

将文件中的所有the替换为THE,可以执行下图中的命令:

若想将文件中的所有o删除(即替换为空的字符串),可以执行下图中的命令:

若想在每行的行首都插入#号,可以执行下图中的命令:

当然也可以通过加g,来实现全局都以#开头的效果,如下图:

若想在包含the的每行行首都插入#号,可以执行下图中的命令:

若想在每行的行尾都插入字符串EOF,可以执行下图中的命令:

若想将第3~5行中的所有the替换为THE,可以执行下图中的命令:

若要将包含the的所有行中的o都替换为O,可执行下图中的命令:

(5)迁移符合条件的文本

使用sed命令迁移符合条件的文本时,常用到以下参数:

H——复制到剪切板;

g、G——将剪切板中的数据覆盖/追加至指定行;

w——保存为文件

r——读取指定文件

a——追加指定内容

若想将包含the的行迁移至文件末尾,可执行下图中的操作:

若想将第1~5行的内容转移至第17行之后,可执行下图中的命令:

若想将包含the的行,另存为文件out.file,可执行下图中的命令:

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

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

相关文章

搜狗微信文章数据爬取可视化

搜狗微信文章数据爬取可视化 一、爬取流程1.1 寻找数据接口1.2 发送请求获取数据1.3 xpath表达式解析数据1.4 保存数据二、数据可视化三、完整代码一、爬取流程 搜狗微信的主页:https://weixin.sogou.com/,主页截图如下,在搜索框中输入要查询的内容,以“百合花”为例: 观…

学习记录698@基带传输和频带传输基础

还是在学习计算机网络物理层时遇到这些知识点&#xff0c;这里简单的记录一下&#xff0c;主要都是通信专业的知识 基带传输 信源发出的原始信号叫做基带信号&#xff0c;基带信号分为模拟基带信号与数字基带信号。基带信号一般是低频成分&#xff0c;适合在具有低通特性的有…

203.回溯算法:N皇后(力扣)

class Solution { public:vector<vector<string>> result; // 用于存储所有合法的 N 皇后放置方案// 判断当前位置 (row, col) 是否可以放置皇后bool isValid(int row, int col, vector<string>& chess, int n) {// 检查当前列是否有皇后for (int i 0;…

学好 prompt 让大模型变身撩富婆专家,带你走上人生巅峰

前文 使用大模型的最重要的一步就是编写好的提示词 prompt &#xff0c;但是 prompt 既容易被低估也容易被高估。被低估是因为设计良好的提示词可以显著提升效果。被高估是因为即使是基于提示的应用也需要大量的工程工作才能使其发挥作用。下面我会介绍在编写 prompt 的时候&a…

【面试干货】Java中new与clone操作对象的比较

【面试干货】Java中new与clone操作对象的比较 1、new操作符创建对象的过程2、clone方法创建对象的过程3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、new操作符创建对象的过程 new操作符在Java中用于创建对象&#xff0c;并执行…

一年Java|16K|同程艺龙面经

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 背景 公司&#xff1a;同程艺龙成都BU,现场部门老大面 之前的同程艺龙电话一面过了&#xff0c;然后通知到同程艺龙成都办公地点现场进行部门老大…

C语言实战 | “贪吃蛇”游戏重构

程序设计的过程中,面对复杂项目,利用模块化思维分解任务,是关键的一步。读者一定要掌握模块化思维设计思维,为将来团队合作、协同完成大型应用软件做好准备。 01、“贪吃蛇”游戏 有了游戏框架之后,按照游戏框架完成“贪吃蛇”游戏。 “贪吃蛇”游戏角色有两个:“贪吃蛇…

设计总监独家揭秘:后台管理系统设计全攻略!

后台管理是反映用户行为、提高产品保留率的有力依据。设计师将后台管理的各种数据创建成清晰、合乎逻辑、可操作的后台管理仪表板。当您设计一个美观实用的UI后台管理时&#xff0c;它会给用户带来更直观的信息内容&#xff0c;从而提高用户体验。因此&#xff0c;后台管理设计…

git 查看本地和远程分支

要查看 Git 仓库中的所有分支&#xff0c;可以使用以下命令&#xff1a; git branch执行该命令后&#xff0c;Git 会列出当前仓库中的所有分支&#xff0c;并在当前所在的分支前加上一个 * 标记。 如果你想查看远程仓库的分支&#xff0c;可以添加 -r 或 --remotes 选项&…

详解LLM大模型是如何理解并使用 tools ?

前文 大家肯定对使用大模型的函数回调或者说 Tools 已经耳熟能详了&#xff0c;那么他们具体内部是如何运作的呢&#xff0c;本文就此事会详细给大家介绍具体的细节。 tools 首先是大家最熟悉的环节&#xff0c;定义两个 tool 的具体实现&#xff0c;其实就是两个函数&#…

C语言:sprintf与snprintf

C语言提供了强大的格式化输出的接口&#xff0c;可以输出到不同的文件或者字符串等&#xff0c;以sprintf和snprintf为例介绍一下 sprintf 格式化输出到字符串 函数签名 int sprintf(char *str, const char *format, ...);与printf相比就是多了前面的char*参数&#xff0c;…

PointNet数据预处理+网络训练

PointNet数据预处理网络训练 数据预处理分类网络的训练分割网络训练分类和分割的结果 数据预处理 数据预处理&#xff0c;这里仅介绍一个shapenetdataset&#xff1b; class ShapeNetDataset(data.Dataset):def __init__(self,root,npoints2500,classificationFalse,class_ch…

前端应熟知的各种宽度高度

目录 一、window对象- 浏览器对象模型 二、Document对象-文档对象模型 前端做项目时经常需要使用到各种宽度高度&#xff0c;可以从两个地方获得这些数据。 一、window对象- 浏览器对象模型 浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话"。 所有浏览…

动态图形设计:创造视觉运动的艺术

什么是动态设计&#xff1f;动态设计是一个设计领域&#xff0c;指在用户界面中使用动态效果的设计。简单地说是为了移动用户界面上的元素而设计的。良好的动态设计可以吸引用户的注意&#xff0c;提高用户体验和满意度。动态设计也是界面设计与动态设计的结合&#xff0c;将设…

无人机螺旋桨理论教学培训课程

本文档为一份详细的关于TYTO机器人公司提供的电机和螺旋桨理论及其实验操作的指南。指南首先概述了材料、实验目标以及实验的介绍部分&#xff0c;随后详细阐述了理论问题、实验步骤和附录内容。实验目的在于通过实际测试来测量和理解不同螺旋桨参数对无人机性能的影响&#xf…

上海亚商投顾:沪指5连阴 工业母机概念逆势走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数今日继续调整&#xff0c;沪指午后一度跌近1%&#xff0c;随后探底回升跌幅收窄&#xff0c;创业板指…

如何确保消息不被重复消费

一、重复消费问题出现的原因 导致重复消费的原因可能出现在生产者&#xff0c;也可能出现在 MQ 或 消费者。这里说的重复消费问题是指同一个数据被执行了两次&#xff0c;不单单指 MQ 中一条消息被消费了两次&#xff0c;也可能是 MQ 中存在两条一模一样的消费。 生产者&…

基于Python的求职招聘管理系统【附源码】

摘 要 随着互联网技术的不断发展&#xff0c;人类的生活已经逐渐离不开网络了&#xff0c;在未来的社会中&#xff0c;人类的生活与工作都离不开数字化、网络化、电子化与虚拟化的数字技术。从互联网的发展历史、当前的应用现状和发展趋势来看&#xff0c;我们完全可以肯定&…

金融企业数据跨境流动的核心需求是什么?如何才能落地?

在金融行业&#xff0c;涉及到的数据跨境流动的场景多种多样&#xff0c;主要涉及到金融机构的跨国经营、全球贸易以及服务贸易等多个方面&#xff1a; 企业跨国经营&#xff1a;当金融机构进行跨国经营时&#xff0c;如银行在海外设立分支机构或进行跨境投资&#xff0c;会涉及…

408数据结构-图的应用1-最小生成树 自学知识点整理

前置知识&#xff1a;图的遍历 图的应用是408初试历年考查的重点。不过一般而言&#xff0c;这部分内容直接以算法设计题形式考查的可能性极小&#xff0c;更多的是结合图的实例来考查算法的具体操作过程&#xff0c;要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…