Shell编程基础(十三)正则表达式

正则表达式

    • 正则表达式
    • 元数据
      • 普通元字符
      • 扩展元字符
    • 总结
      • ^ 和 \< 的区别 以及 $ 和 \> 的区别
      • * + ? {}的区别

正则表达式

格式:^ 表达式 $
在不同的场景下,定义是一样,但使用要按照具体的命令去调用,中间的表达式都是通用的

元数据

普通元字符

所谓元数据,就是描述数据的数据,在这里就是描述正则的数据

  • ^ 表示正则从字符串整行起始位置匹配
    ^abc 匹配 以abc开始的字符串
  • $ 表示正则一直匹配到字符串整行结束位置
    abc$ 匹配以abc结尾的字符串

如果一个正则表达式不是^开始,表示不限制字符串前缀内容,如果不是$结束,则不限制字符串后缀内容,如果都没有,则表示任意位置匹配上都算成功

[root@origin ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@origin ~]# cat /etc/passwd | grep ^root
root:x:0:0:root:/root:/bin/bash[root@origin ~]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
kalpana:x:1000:1000:kalpana:/home/kalpana:/bin/bash
zp:x:1001:1001::/home/zp:/bin/bash
[root@origin ~]# cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
kalpana:x:1000:1000:kalpana:/home/kalpana:/bin/bash
zp:x:1001:1001::/home/zp:/bin/bash
  • . 一个点,匹配一个任意字符

  • " * " 星号,匹配左侧紧挨的那个字符 0次或多次;如 “123*”:匹配 12 和 12后面紧跟3的字符串(123,1233,1234.但是不匹配 124
    **直觉上直接就是前缀匹配前面的固定字符,但实际还可以匹配 去掉*左侧紧挨的那个字符后的字符串

  • .* 根据上面 星号的定义,可以得出 .* 可以匹配任意字符串

  • [] 匹配括号内任意一个字符。 1[abc]2 可以匹配 1a2 1b2 1c2

  • [^] 不匹配括号内所有字符。1[^ab]2 可以匹配除了 1a2 和 1b2 之外的字符串

  • [-] 匹配一个连续的范围。[0-9] 匹配一个 0-9的字符

  • \ 转义符,这在各种编程语言中都是存在的,其目的是去掉一些原本带有特殊含义的字符代表的特殊含义,使其变成字面意思。只作用在一个字符上

  • ‘’ “” 单引号 / 双引号 也可以转义,但是他俩带有边界,可能影响原有字符串 引号的边界。‘’ 单引号为强引用,其内部所有字符均被转义; “” 双引号为弱引用,其内部部分字符被转义;比如空格被转义,但是可以使用 $获取变量

  • \< 词首(空格隔开为一个词,词首可能不是整行第一个单词)匹配 <abc。匹配形如 abcxxx 或者 xxx abcxxx 的字符串

  • \> 词尾(空格隔开为一个词)匹配 >abc。 匹配形如 xxxabc 或者 xxxabc xxx 的字符串

  • () 将多个字符视为一个整体,用于后面匹配,替换等操作
    如:给匹配上的字符串增加一个前缀 s/(^bc)xx/\1de/ ;匹配 bcxx开头的字符串,然后 \1 的值就是前面^bc命中的字符串括号内的部分,然后把()内的字符串(也就是bc)取出来,并将后面的xx换成de。
    \1 代表前面第一个()内的内容
    \2 代表前面第二个()内的内容
    依次类推

    s/查找字符串/要替换的字符串/

  • x{m} 匹配 前导字符 重复的次数。这里意味着匹配m * n个x(n 正整数)

  • x{m,} 匹配 前导字符 重复次数大于等于 m

  • x{m,n} 匹配 前导字符 重复次数大于等于 m 小于等于n

扩展元字符

grep 默认只支持普通元字符,要使用扩展元字符,要么使用 grep -E 选项 要么使用 egrep 命令

测试文本如下

a
ab
ac
abc
abbc
abbbc
abbbcc
  • +
    匹配一个或多个前导字符,和 * 的区别在于 * 匹配的是0个或多个前导字符,而 + 是1个或多个。ab+c 匹配 abc abbc abbbc
    ab*c 匹配 ac abc abbc abbbc
    相当于 * 比 + 多了一种不包含前导字符的情况。
grep "ab*c" test_reg.txt
ac
abc
abbc
abbbc
abbbccgrep -E "ab+c" test_reg.txt
abc
abbc
abbbc
abbbccegrep "ab+c" test_reg.txt
abc
abbc
abbbc
abbbcc

  • 匹配 0 或 1个 前导字符

  • |
    匹配 | 分隔的任意一项

  • ()
    将多个字符作为一个整体进行匹配。如果没有()分割,则会将原本分隔的地方前后的字符串当作一个字符串处理
    abc(de|aa):这里就匹配 abcde 或者 abcaa
    如果不加()
    abcde|aa:则变成了 匹配 abcde 或者 aa

总结

^ 和 < 的区别 以及 $ 和 > 的区别

上述2种区别都类似:
^ $ 匹配的是整个字符串的首尾
而 \< \> 匹配的是字符串中的词(整个字符串根据空格可以拆分成多个词)的首尾

* + ? {}的区别

  • ’ * ’ :星号代表的是 0 或者 多个 前导字符
    abc* 等同于 abc{0,}

  • ’ + ’ :代表匹配 1个 或者 多个 前导字符
    abc+ 等同于 abc{1,}

  • ? 代表 0个 或者 1个 前导字符
    abc? 等同于 abc{0,1}

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

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

相关文章

机器学习笔记:李宏毅ChatGPT课程1:刨析ChatGPT

ChatGPT——Chat Generative Pre-trained Transformer 1 文字接龙 每次输出一个概率分布&#xff0c;根据概率sample一个答案 ——>因为是根据概率采样&#xff0c;所以ChatGPT每次的答案是不一样的&#xff08;把生成式学习拆分成多个分类问题&#xff09;将生成的答案加到…

Linux(进程)

Linux&#xff08;进程&#xff09; 1. 冯诺依曼结构体系2 . 操作系统&#xff08;OS&#xff09;3.进程task_ struct内容分类查看进程查看PID以及PPIDfork()Linux操作系统进程的状态僵尸进程孤儿进程进程优先级其他概念 1. 冯诺依曼结构体系 冯诺依曼结构也称普林斯顿结构&am…

C++ | 查看结构体中成员变量在内存中的偏移量(结构体内存对齐)

内存在使用过程并不是单一的依次排列&#xff0c;而是按照某种既定的规则来进行对齐&#xff0c;以方便快速访问 内存的对齐原则有以下三条: 数据成员对齐:成员根据其自身大小&#xff0c;从自身大小的整数倍内存地址(以第一个元素存储在0位置为参考)开始存储结构体成员对齐:如…

ArcGIS、ENVI、InVEST、FRAGSTATS技术教程

专题一 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 专题二 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注…

让我目瞪口呆的BUG:网络问题导致的双主从故障

引言&#xff1a; 在软件开发过程中&#xff0c;我们经常会遇到各种各样的BUG。有些BUG会让我们感到困惑和无奈&#xff0c;而有些则让我们目瞪口呆。今天我要和大家分享的就是我在开发过程中遇到的一个令人难以置信的BUG&#xff0c;即由于网络问题导致的双主从故障。 问题背…

Leetcode每日一题:1749. 任意子数组和的绝对值的最大值(2023.8.9 C++)

目录 1749. 任意子数组和的绝对值的最大值 题目描述&#xff1a; 实现代码与解析&#xff1a; 动态规划 分类讨论 原理思路&#xff1a; 前缀和 原理思路&#xff1a; 1749. 任意子数组和的绝对值的最大值 题目描述&#xff1a; 给你一个整数数组 nums 。一个子数组 […

Mongodb 常用操作

// 查询 user_id 是否存在 db.getCollection("t_mongo_user").find({"user_id" : { $exists: true }}) // 查询 user_id 10 的记录 db.getCollection("t_mongo_user").find({"user_id" : 10}) // 排序 -1&#xff0c;按照 _id 倒…

机器学习、深度学习项目开发业务数据场景梳理汇总记录二

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

设计模式十一:外观模式(Facade Pattern)

外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问系统中的一组复杂子系统。外观模式通过将复杂子系统的接口封装在一个高层接口中&#xff0c;简化了客户端与子系统之间的交互&#xff0c;使得客户…

Unity C# 优先队列

实现了支持泛型的优先队列&#xff0c;解决Unity官方不提供优先队列的问题。 API 属性和字段解释size队列的长度capacity队列的容量IsEmpty返回队列是否为空Top返回队列第一个元素 枚举解释PriorityQueueMode.less最小优先队列PriorityQueueMode.equal只会将相等的排在一起P…

泰国的区块链和NFT市场调研

泰国的区块链和NFT市场调研 基本介绍 参考&#xff1a; https://zh.wikipedia.org/zh-hans/%E6%B3%B0%E5%9B%BD参考&#xff1a; https://hktdc.infogram.com/thsc–1h7k2303zo75v2x zz制度&#xff1a; 君主立宪制&#xff08;议会制&#xff09; 国王&#xff1a; 玛哈哇集拉…

如何给Google Chrome增加proxy

1. 先打开https://github.com/KaranGauswami/socks-to-http-proxy/releases 我的电脑是Liunx系统所以下载第一个 2. 下载完之后把这个文件变成可执行文件&#xff0c;可以是用这个命令 chmod x 文件名 3. 然后执行这个命令&#xff1a; ./sthp-linux -p 8080 -s 127.0.0.1:…

HTTP协议

HTTP协议 应用层再谈 "协议"网络版计算器 HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见Header HTTPS协议HTTPS 是什么什么是"加密"为什么要加密常⻅的加密⽅式 HTTPS 的⼯作过程探究⽅案 1 - 只使⽤对称加密⽅案 2 - 只…

HBase-读流程

创建连接同写流程。 &#xff08;1&#xff09;读取本地缓存中的Meta表信息&#xff1b;&#xff08;第一次启动客户端为空&#xff09; &#xff08;2&#xff09;向ZK发起读取Meta表所在位置的请求&#xff1b; &#xff08;3&#xff09;ZK正常返回Meta表所在位置&#x…

企业权限管理(五)-订单分页

订单分页查询 PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件&#xff0c;它支持基本主流与常用的数据库&#xff0c;例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。 PageHelper使用 集成 引入分页插件有下面2种方式&#xff0c;推荐使用 Maven …

TC3XX - MCAL知识点(二十三):ASCLIN MCAL配置及代码实战

目录 1、概述 2、EB-tresos配置 2.1、配置目标 2.2、LIN配置 2.2.1、LinGeneral 2.2.2、LinChannel

什么是Linux,如何在Windows操作系统下搭建Linux环境,远程连接Linux系统

文章目录 什么是LinuxLinux的诞生及发展为什么要学习LinuxLinux内核Linux发行版什么是虚拟机如何在VMware虚拟机中搭建Linux系统环境远程连接 Linux 系统Linux 帮助网站 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户…

NLP实践——使用Llama-2进行中文对话

NLP实践——使用Llama-2进行中文对话 1. 前言2. 利用prompt3. 利用Logit Processor3.1 修改13.2 修改23.3 修改33.4 修改4 1. 前言 在之前的博客 NLP实践——Llama-2 多轮对话prompt构建中&#xff0c;介绍了如何构建多轮对话的prompt&#xff0c;本文将介绍如何使用Llama-2进…

Celery的基本使用

1.Celery介绍 1.1 Celery是什么&#xff1f; Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块专注于实时处理的异步任务队列同时也支持任务调度 Celery本身不含消息服务&#xff0c;它使用第三方消息服务来传递任务&#xff0c;目前&#xff0c;Ce…

无涯教程-Perl - 格式化

Perl使用称为“formats”的模板来输出内容。要使用Perl的格式函数&#xff0c;必须先定义一种格式&#xff0c;然后才能使用该格式写入格式化的数据。 定义格式 以下是定义Perl格式的语法- format FormatName fieldline value_one, value_two, value_three fieldline value…