Linux操作系统基础 – 正则表达式快速入门

news2024/11/28 16:42:57

Linux操作系统基础 – 正则表达式快速入门

Linux Operating System Essentials - Introduction to Regular Expressions

通常在计算机科学领域,正则表达式被解释为对字符串操作的一种逻辑公式,即用事先定义好的特定字符及其组合组成所谓的“规则字符串”,而我们用它来表达对字符串的一种过滤逻辑。

规划这种过滤逻辑的用途,是查找和匹配特定文本中的字符串,从而进行和优化内容分析,使工作提高效率。

本文将介绍正则表达式的匹配规则和应用案例,并用grep工具实现正则表达式的各种功能。

0. 正则表达式匹配字符

正则表达式模式匹配字符及配合使用的Quantifier(量词)和控制字符有其自身的作用,例如:
在这里插入图片描述
在这里插入图片描述

1. Grep与正则表达式

grep 是 Linux 中最有用并且非常强大的文本处理命令之一。grep 可以在一个或多个输入文件中搜索与正则表达式匹配的行,并将每个匹配行写入标准输出。

在本文中,我们将探讨如何在 GNU 版本的 grep 中使用正则表达式的基础知识,该版本在大多数 Linux 操作系统中默认可用。

Regular Expressions (或 正则表达式) 是与一组字符串匹配的模式。模式由运算符、构造文字字符和元字符组成,它们具有特殊含义。GNU grep
支持三种正则表达式语法:基本、扩展和 Perl 兼容

在最简单的形式中,当没有给出正则表达式类型时,grep 将搜索模式解释为基本正则表达式。若要将模式解释为扩展正则表达式,请使用 -E(或 --extended-regexp)选项。

在 GNU 的 grep 实现中,基本正则表达式语法和扩展正则表达式语法之间没有功能上的区别。唯一的区别是,在基本正则表达式中,元字符 ?、+、{、|、( 和 ) 被解释为文字字符。为了在使用基本正则表达式时保留元字符的特殊含义,必须使用反斜杠 () 对字符进行转义。我们稍后将解释这些元字符和其他元字符的含义。

通常,应始终将正则表达式括在单引号(‘ ’)中,以避免 shell 对元字符的解释和扩展。

2. 匹配字面量(Matching Literals)

grep 命令的最基本用法是在文件中搜索文字字符或一系列字符。例如,如果需要在 /etc/passwd 文件中显示包含字符串“bash”的所有行,请运行以下命令:

#  grep bash etc/passwd

执行结果如下图所示:
在这里插入图片描述

在此示例中,字符串“bash”是一个基本正则表达式,由四个文本字符组成。这个命令告诉 grep 搜索一个字符串,该字符串后面跟着**“a”、“s”和“h”。**

默认情况下,grep 命令区分大小写。这意味着大写和小写字符被视为不同的字符。

要在搜索时忽略大小写,请使用 -i 选项(或 --ignore-case)。

需要注意的是,grep 将搜索模式查找为字符串,而不是单词。因此,如果你正在搜索 “ok”,grep 也会打印 “ok” 嵌入在较大单词中的行,例如 “look” 或 “cook”。

如果搜索字符串包含空格,则需要将其括在单引号或双引号中,见如下示例:

# grep “Gnome Display Manager” /etc/passwd

3. 锚固(Anchoring)
锚点是元字符,可用于指定必须在行中找到匹配项的位置。

^(插入符号)与行首的空字符串匹配。在以下示例中,仅当字符串“linux”出现在一行的开头时,它才会匹配。我们先看一下要过滤的文本文档file.txt内容:

Looking to get started in Linux? Develop a good working knowledge of Linux using both the graphical interface and command line across the major Linux distribution families with The Linux Foundation’s Intro to Linux online course. Enroll for free here.

尝试用以下grep命令从file.txt过滤不同需求的字符串。

 grep “Linux” file.txt

执行结果如下:
在这里插入图片描述

grep '^linux' file.txt

$(美元)符号与行首的空字符串匹配。要查找以字符串“linux”结尾的行,请使用:
例如:

grep 'linux$' file.txt

您还可以使用两个锚点构造正则表达式。例如,若要查找仅包含“linux”的行,请运行:

grep '^linux$' file.txt

另一个有用的示例是匹配所有空行的 ^$ 模式。

4. 匹配单个字符

这个"."(句点)符号是与任何单个字符匹配的元字符。例如,若要匹配以“kan”开头、包含两个字符并以字符串“roo”结尾的任何内容,请使用以下模式:

grep 'kan..roo' file.txt

5. grep accept[np]t**

括号表达式
括号表达式允许通过将一组字符括在方括号 [ ] 内来匹配这些字符。例如,查找包含“accept”或“accent”的行,可以使用以下表达式:

grep 'acce[np]t' file.txt

如果括号内的第一个字符是插入符号 ^,则它与括号中未括起来的任何单个字符匹配。以下模式将匹配以“co”开头的字符串的任意组合,后跟除“l”后跟“la”以外的任何字母,例如“coca”、“cobalt”等,但与包含“cola”的行不匹配:

grep 'co[^l]a' file.txt

您可以在括号内指定一系列字符,而不是逐个放置字符。范围表达式是通过指定范围的第一个和最后一个字符来构造的,这些字符用连字符分隔。例如,[a-e] 等同于 [abcde],[1-3] 等同于 [123]。

以下表达式匹配以大写字母开头的每一行:
grep '^ 范围表达式‘ file.txt

6. Quantifier(量词)

限定符允许您指定匹配项的出现次数,这些项必须存在才能发生匹配。下表显示了 GNU grep 支持的量词:

限定符允许您指定匹配项的出现次数,这些项必须存在才能发生匹配。下表显示了 GNU grep 支持的量词:

Quantifier Description
(*) 将前一项匹配零次或多次。(不含括号)
? 将前一项匹配零次或一次。
(+) 匹配前一项一次或多次。(不含括号)
{n} 将前一项精确匹配n次。
{n,} 匹配前一项至少n次。。
{,m} 最多匹配前一项 m 次。
{n,m} 从 n 次到 m 次匹配前项。

*(星号)字符与前一项匹配零次或多次。例如,以下命令将匹配“right”、“sright”、“ssright”等:

grep 's*right'

下面是更高级的模式,它匹配所有以大写字母开头并以句点或逗号结尾的行。.* 正则表达式匹配任意数量的任意字符:

grep -E '^[A-Z].*[.,]$' file.txt

(问号)字符使前一项可选,并且只能匹配一次。以下内容将同时匹配“明亮”和“正确”。这?字符使用反斜杠转义,因为我们使用的是基本的正则表达式:

grep 'b?right' file.txt

以下是使用扩展正则表达式的相同正则表达式:

grep -E 'b?right' file.txt

+(加号)字符与前一项匹配一次或多次。以下内容将匹配“sright”和“ssright”,但不匹配“right”:

grep -E 's+right' file.txt

大括号字符 {} 允许您指定匹配发生所必须发生的确切数字、上限或下限或出现次数范围。

以下命令将匹配 3 到 9 位之间的所有整数:

grep -E '[[:d igit:]]{3,9}' file.txt

7.交替

1.术语交替是一个简单的“OR”。交替运算符 |(pipe) 允许您指定不同的可能匹配项,这些匹配项可以是文本字符串或表达式集。此运算符在所有正则表达式运算符中具有最低的优先级。

在下面的示例中,

如果使用扩展正则表达式,则运算符 |不应转义,如下所示:

grep -E 'fatal|| error| critical' /var/log/nginx/error.log

8.分组

分组是正则表达式的一项功能,允许您将模式组合在一起并将它们作为一个项目引用。使用括号() 创建组。
使用基本正则表达式时,括号必须使用反斜杠 () 进行转义。

以下示例同时匹配“fearless”和“less”。这个?量词使 (fear) 组可选:

grep -E '(fear)?less' file.txt

9. 特殊反斜杠表达式

GNU grep 包含几个元字符,由一个反斜杠和一个常规字符组成。下表显示了一些最常见的特殊反斜杠表达式:

附:表达式说明

b 匹配单词边界。
< 匹配单词开头的空字符串。 > 匹配单词末尾的空字符串。 w 匹配一个单词。 s 匹配空格。

此模式将匹配单独的单词“abject”和“object”。如果嵌入到较大的单词中,它将与单词不匹配:

grep 'b[ao]bjectb' file.txt

10. 小结

正则表达式用于文本编辑器、编程语言和命令行工具,例如 grep、sed 和 awk 。了解如何构造正则表达式在搜索文本文件、同时在编写脚本或过滤命令输出时非常有用。(参考资料:Linuxize.com)

技术好文陆续推出,敬请关注。

喜欢就点赞哈。😊

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

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

相关文章

SpringBoot使用DevTools实现后端热部署

&#x1f4d1;前言 本文主要SpringBoot通过DevTools实现热部署的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&…

GZ038 物联网应用开发赛题第10套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第10套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考…

ai剪辑矩阵系统源码+无人直播系统源码技术开发

开发AI剪辑矩阵系统和无人直播系统源码&#xff0c;需要以下步骤&#xff1a; 1. 市场调研&#xff1a;了解市场需求和竞品情况&#xff0c;明确系统的功能和特点。 2. 系统设计&#xff1a;设计系统的整体架构和功能模块&#xff0c;包括视频剪辑、直播推流、实时互动、数据分…

【Linux】Ubuntu16.04下安装python高版本--源码安装

Ubuntu16.04下完美安装python高版本及对应版本的pip 方法一:直接用命令安装python3.6&#xff08;但我没安装成功&#xff09; 好像是因为Ubuntu16.04的软件仓库&#xff08;源&#xff09;中python的最高版本就是python3.5&#xff0c;所以无法直接用apt来安装 #方法一 sudo…

学习c#的第十四天

目录 C# 接口&#xff08;Interface&#xff09; 接口的特点 定义接口 接口继承 接口和抽象类的区别 C# 命名空间&#xff08;Namespace&#xff09; using 关键字 定义命名空间 嵌套命名空间 C# 接口&#xff08;Interface&#xff09; 接口定义了所有类继承接口时应…

Linux系统进程——进程的退出、子进程退出的收集、孤儿进程

进程退出 进程退出主要分为两种&#xff1a;正常退出、异常退出 正常退出 正常退出分为以下几种&#xff1a; 1.main函数调用return 2.进程调用exit(),标准c库 3.进程调用 _exit() 或者 _Exit() &#xff0c;属于系统调用 4.进程最后一个线程返回 5.最后一个线程调用pthrea…

asp.net网上书店管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net网上书店管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net网上书店系统1 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&#xff0c;SQL Server为…

影响气膜建筑坍塌的原因

气膜建筑以其轻盈、透光、环保等特性&#xff0c;逐渐在建筑领域崭露头角。然而&#xff0c;这种建筑形式并非没有缺陷&#xff0c;其安全性与稳定性直接影响到建筑物的使用寿命和人员安全。 一、结构设计不合理 气膜建筑的结构设计是影响其稳定性的关键因素。良好的结构设计能…

LeetCode(24)文本左右对齐【数组/字符串】【困难】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 文本左右对齐 1.题目 给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单…

delphi电子处方流转 sm2 sm4(药店)

【delphi电子处方流转(药店)】支持 处方下载、处方核验、处方审核、药品销售出库明细上传、药品销售出库明细撤销等功能。技术交流Q 648437169 下载链接&#xff1a;https://download.csdn.net/download/liushenglin123/88543771

数据结构(c语言版本) 二叉树的遍历

要求 实现二叉树的创建&#xff0c;并输入二叉树数据 然后先序遍历输出二叉树、中序遍历输出二叉树、后序输出二叉树 例如二叉树为&#xff1a; 该二叉树的先序遍历结果为&#xff1a; A B D C E F 该二叉树的中序遍历结果为&#xff1a; B D A E C F 该二叉树的后序遍历结果…

从0开始学习JavaScript--JavaScript 函数

JavaScript中的函数是编写可维护、模块化代码的关键。本文将深入研究JavaScript函数的各个方面&#xff0c;包括基本语法、函数作用域、闭包、高阶函数、箭头函数等&#xff0c;并通过丰富的示例代码来帮助读者更好地理解和应用这些概念。 函数的基本语法 函数是一段可被重复…

Java网页版即时通讯聊天系统(附源码)

疫情期间,整天闷在家里又不能聚会,大把的空余时间差点让我发霉,后来有个客户发来新年祝贺,情不自禁想起了一件事情,就是他曾经提起过,要是在后台管理系统里面整合个聊天功能该多好啊,有了这个念头,马上行动起来!!! 一.系统演示 1.1 聊天窗体主界面演示 1.2 模拟两…

Java集合List报错,java.lang.UnsupportedOperationException

目录 一、点击Arrays.asList源码&#xff0c;一探究竟二、习惯了Arrays.asList&#xff0c;就是想用.add()添加元素&#xff0c;怎么办&#xff1f;三、又有一个同事&#xff0c;是这样写的四、重新点击Arrays.asList源码&#xff0c;一探究竟五、全是坑&#xff0c;怎么办&…

iframe渲染后端接口文件和实现下载功能

一&#xff1a;什么是iframe&#xff1f; 1、介绍 iframe 是HTML 中的一种标签&#xff0c;全称为 Inline Frame&#xff0c;即内联框架。它可以在网页中嵌入其他页面或文档&#xff0c;将其他页面的内容以框架的形式展示在当前页面中。iframe的使用方式是通过在HTML文档中插入…

python连接elasticsearch

问题一&#xff1a;urllib3.exceptions.ProtocolError: (‘Connection aborted.’, RemoteDisconnected(‘Remote end closed connection without response’)) 协议写错了&#xff0c;是https 问题一&#xff1a;SSLError([SSL: CERTIFICATE_VERIFY_FAILED] certificate ver…

uni-app:如何配置uni.request请求的超时响应时间(全局+局部)

方法一&#xff1a;全局配置响应时间 一、进入项目的manifest.json的代码视图模块 二、写入代码 "networkTimeout": {"request": 5000 }, 表示现在request请求响应时间最多位5秒 方法二&#xff1a;局部设置响应时间 一、直接在uni.request中写入属性…

Redis7.2.3集群安装,新增节点,删除节点,分配哈希槽,常见问题

概念&#xff1a; 【Redis】高可用之三&#xff1a;集群&#xff08;cluster&#xff09; - 知乎 实操&#xff1a; Redis集群三种模式 主从模式 优势&#xff1a; 主节点可读可写 从节点只能读&#xff08;从节点从主节点同步数据&#xff09; 缺点&#xff1a; 当主节点…

UE基础篇八:平衡蓝图与C++的使用

一、蓝图转换C++ 案例结构: 1.1 蓝图和C++对比 1.2 将蓝图变量转C++ 现在C++中定义同样的类型

【分布式】BASE理论详解

一、什么是BASE理论&#xff1f; BASE理论是对分布式系统设计和处理的一种理论指导&#xff0c;相对于ACID&#xff08;原子性、一致性、隔离性和持久性&#xff09;这一强一致性模型&#xff0c;BASE更强调在分布式系统中牺牲强一致性以获得可用性和性能的平衡。 BASE 理论是…