当前位置: 首页 > news >正文

shell 脚本:正则表达式

shell 脚本:正则表达式

一、概述

1、概念

正则表达式是你所定义的模式模板,Linux工具可以用它来过滤文本。Linux工具(比如sed编辑器或gawk程序)能够在处理数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进一步处理;如果数据不匹配模式,它就会被滤掉。

数据流 → 正则表达式 → (1)匹配的数据 (2)滤掉的数据

正则表达式(Regular Expression,简称RE),是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的分割、匹配、查找及替换操作。即正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

简单来说,正则表达式是通过一些特殊字符的排序,用以删除、查找、替换一行或者多行文字字符串的程序。

2、作用

正则表达式通常用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是由普通字符与元字符组成:

  • 普通字符包括大小写字母、数字、标点符号及一些其他符号
  • 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
3、可达到的目的

给定一个正则表达式和另一个字符串,我们可以达到如下目的:

  • 给定的字符串是否符合正则表达式的过滤逻辑(称作"匹配")
  • 可以通过正则表达式,从字符串中获取我们想要的特定部分

二、基础正则

1、基础正则常见元字符(支持的工具:grep、egrep、sed、awk)
元字符描述示例
\转义字符,用于取消特殊符号的含义\!, \n, \$
^匹配字符串开始的位置^a, ^the, ^#, ^[a-z]
$匹配字符串结束的位置word$, ^$(匹配空行)
.匹配除\n之外的任意的一个字符lo.*k, lo.k, l..k
*匹配前面一个字符出现0次或者多次loo*k, lo*k
[list]匹配list列表中的一个字符go[ola]d, [abc], [a-z], [a-z0-9], [0-9](匹配任意一位数字)
[^list]匹配任意非list列表中的一个字符[^0-9], [^A-Z0-9], [^a-z](匹配任意一位非小写字母)
\{n\}匹配前面一个字符n次lo\{2\}k, '[0-9]\{2\}'(匹配两位数字)
\{n,\}匹配前面一个字符不少于n次lo\{2,\}k, '[0-9]\{2,\}'(匹配两位及两位以上数字)
\{n,m\}匹配前面一个字符n到m次lo\{2,3\}k, '[0-9]\{2,3\}'(匹配两位到三位数字)

注意:egrep、awk使用{n}{n,}{n,m}匹配时,“{}“前不用加””

2、示例

示例原始文件

[root@yanyvhang ~]# vim a.txt
# 内容
lk
lok
look
loook
looooook
loooooaaak
looooooook
abbbbcd
abbbbcd666
ooooloooook
oooooolk
aoblck
labk
[root@yanyvhang ~]# vim b.txt
# 内容
aaabd
cdd
cdc
cdd
[root@yanyvhang ~]# vim c.txt
# 内容
lok
lo12k
lo1k
loAk
loBk
look
loak
lodk
abcd
1234
  1. * 匹配前面一个字符0次或者多次

    [root@yanyvhang ~]# grep "loo*k" a.txt
    [root@yanyvhang ~]# grep "lo*k" a.txt
    

    在文件 a.txt 中搜索

    * 表示前面的字符 o 可以出现零次或多次

    在这里插入图片描述

  2. . 匹配除 \n 之外的任意的一个字符

    [root@yanyvhang ~]# grep "lo.*k" a.txt
    [root@yanyvhang ~]# grep "lo.k" a.txt
    [root@yanyvhang ~]# grep "l..k" a.txt
    

    在文件 a.txt 中搜索

    . 匹配任意单个字符,* 表示前面的元素(即 .)可以出现零次或多次

    即表示匹配任意长度的任意字符串

    在这里插入图片描述

  3. 匹配次数控制

[root@yanyvhang ~]# grep "lo\{3\}k" a.txt 
[root@yanyvhang ~]# grep "lo\{3,\}k" a.txt 
[root@yanyvhang ~]# grep "lo\{3,5\}k" a.txt 

{3\} 前面的一个字符 (o) 出现3次

{3,\} 前面的一个字符 (o) 出现不少于3次

{3,5\} 前面的一个字符 (o) 出现3到5次

在这里插入图片描述

  1. 匹配字符串开始和结束的位置置

    [root@yanyvhang ~]# grep "^c" b.txt 
    [root@yanyvhang ~]# grep "d$" b.txt 
    [root@yanyvhang ~]# grep "^$" b.txt 
    

    ^c 匹配以 c 开头的字符串

    d$ 匹配以 d 结尾的字符串

    ^$ 匹配空行

    在这里插入图片描述

  2. 匹配列表中的字符或非列表字符

    [root@yanyvhang ~]# grep "lo[a-zA-Z0-9]k" c.txt 
    [root@yanyvhang ~]# grep "lo[ABo]k" c.txt 
    [root@yanyvhang ~]# grep "lo[^a-zA-Z]k" c.txt 
    [root@yanyvhang ~]# grep "[^a-zA-Z]" c.txt 
    

    lo[a-zA-Z0-9]k 表示在 lok 中匹配的字符为任意字母和数字

    lo[ABo]k 表示在 lok 中匹配的字符为 A B o 中的一个

    lo[^a-zA-Z]k 表示在 lok 中匹配的字符非字母

    [^a-zA-Z] 表示非纯字母的字符串

    在这里插入图片描述

三、扩展正则

扩展正则表达式在基础正则的基础上增加了更多元字符,功能更强大(常用工具:egrep, awk

因为文档格式原因这里使用 I 代替 | (管道符,使用时请注意)

元字符描述示例
+匹配前面一个字符1次以上lo+k(匹配lok、look、loook等)
?匹配前面一个字符0次或者1次lo?k(匹配lk或lok)
()将括号中的字符串作为一个整体l(oo)+k(匹配look、looook等)
I以或的方式匹配字符串l(oo I ab)k(匹配look或labk)
{}允许为可重复的正则表达式指定一个上限(间隔){n}, {n,}, {n,m}

注意:在扩展正则中,{} 前不需要加转义符 \

  1. 匹配前面一个字符1次以上

    [root@yanyvhang ~]# egrep "lo+k" a.txt 
    

    在这里插入图片描述

  2. 匹配前面一个字符0次或者1次

    [root@yanyvhang ~]# egrep "lo?k" a.txt 
    

    在这里插入图片描述

  3. 将括号中的字符串作为一个整体

    [root@yanyvhang ~]# egrep "l(oo)+k" a.txt 
    

    在这里插入图片描述

  4. 以或的方式匹配字条串

    [root@yanyvhang ~]# egrep "l(oo|ab)+k" a.txt 
    

    在这里插入图片描述

  5. 允许为可重复的正则表达式指定一个上限

    [root@yanyvhang ~]# egrep "lo{3}k" a.txt 
    [root@yanyvhang ~]# egrep "lo{3,}k" a.txt 
    [root@yanyvhang ~]# egrep "lo{3,5}k" a.txt 
    

    在这里插入图片描述

四、特殊的字符组

POSIX标准定义了一些特殊的字符组,用于匹配特定类型的字符:

字符组描述
[[:alpha:]]匹配任意字母字符(大写或小写)
[[:alnum:]]匹配任意字母数字字符(0-9, A-Z, a-z)
[[:blank:]]匹配空格或制表符(Tab键)
[[:digit:]]匹配0-9之间的数字
[[:lower:]]匹配小写字母字符(a-z)
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配标点符号
[[:space:]]匹配任意空白字符:空格、tab、换行等
[[:upper:]]匹配任意大写字母字符(A-Z)

这些字符组在字符类中(即方括号内)使用,例如:grep "[[:digit:]]" file.txt 匹配包含数字的行


文章转载自:

http://0e6B0Thr.ryzgp.cn
http://pjWQaend.ryzgp.cn
http://Bb8X8A5N.ryzgp.cn
http://LC9vbv4W.ryzgp.cn
http://ilZ3drSp.ryzgp.cn
http://mJw6gpJP.ryzgp.cn
http://6VqS0nyd.ryzgp.cn
http://4hEtyu82.ryzgp.cn
http://yjzStPv8.ryzgp.cn
http://3DkTJkuL.ryzgp.cn
http://gqeETaso.ryzgp.cn
http://g77HLdRN.ryzgp.cn
http://BOo1WhFd.ryzgp.cn
http://dOKT9JwC.ryzgp.cn
http://XBeUJcP9.ryzgp.cn
http://AWcL4ZX1.ryzgp.cn
http://q1qKtSaA.ryzgp.cn
http://QooIUDw8.ryzgp.cn
http://fOiDh00s.ryzgp.cn
http://dQynvzNm.ryzgp.cn
http://d89I7DoZ.ryzgp.cn
http://J8DuVDqp.ryzgp.cn
http://cYP91V7a.ryzgp.cn
http://ru7byPca.ryzgp.cn
http://nJadyA4y.ryzgp.cn
http://K6Iix2OM.ryzgp.cn
http://SwLd4RNq.ryzgp.cn
http://Rb0IqiQv.ryzgp.cn
http://SVobqjv3.ryzgp.cn
http://nSQwEMGt.ryzgp.cn
http://www.dtcms.com/a/382960.html

相关文章:

  • 可调精密稳压器的原理
  • Altium Designer(AD)PCB打孔
  • React 状态管理
  • [Spring Cloud][5] 注册中心详解,CAP 理论,什么是 Eureka
  • 返利app的跨域问题解决方案:CORS与反向代理在前后端分离架构中的应用
  • C++算法题—图的邻接矩阵输入形式(I\O)
  • 主动性算法-如何让机器拥有嗅觉?
  • Knockout.js Google Closure Compiler 工具模块详解
  • 从关键词匹配到语义理解:6大Embedding技术如何重塑企业搜索
  • 【面试实录01】
  • Docker 容器化部署核心实战——镜像仓库管理与容器多参数运行详解
  • Jenkins的安装与简单使用
  • Step-by-Step:用C语言构建一个带精准错误提示的括号匹配器
  • 【LeetCode - 每日1题】元音拼写检查器
  • KingbaseES读写分离集群架构解析
  • 教育领域大模型生成题目安全研究报告
  • .Net程序员就业现状以及学习路线图(七)
  • uniapp如何使用本身的字体图标
  • Uniapp崩溃监控体系构建:内存泄漏三维定位法(堆栈/资源/线程)
  • window显示驱动开发—显示适配器的子设备
  • 单变量单步时序预测 | TCN-BiGRU时间卷积神经网络结合双向门控循环单元
  • 项目实战——“微商城”前后台【005】之前台项目首页编写
  • 如何利用redis使用一个滑动窗口限流
  • Go与Python/PHP的比较
  • JVM 运行时数据区详解:程序计数器、虚拟机栈、堆内存、方法区与直接内存
  • MongoDB $type 操作符
  • 【靶场练习】--DVWA第一关Brute Force(暴力破解)全难度分析
  • ConcatenationShortcut
  • 设计模式(C++)详解—原型模式(3)
  • 设计模式(C++)详解—原型模式(2)