bash shell 无法使用 perl 正则

news2024/12/23 23:36:48

在这里插入图片描述

1.案例现象

前几天有一个小伙伴在群里求助,说他这个 shell 脚本有问题,让大家帮忙看看

在这里插入图片描述

#!/bin/bash
regularExpression="^\[(\d+)+\].+$"
content=`cat $1`
for i in ${content}
do
        if [[ $i =~ $regularExpression ]]
        then
                echo -e "\033[32m 【 infomation matching  success! 】\033[0m"
                echo -e "\033[32m ${i} \033[0m"
        else
                echo -e "\033[31m【 infomation dismatch !】\033[0m"
                echo -e "\033[31m ${i} \033[0m"
        fi
done

可以看到,这个脚本首先将目标文本文件的名字当作该脚本的第一个参数($1)传递进去,然后查看这个文本文件的内容(cat $1),并将内容赋值给 firstLine 变量

接着对文本内容的每一行进行遍历然后正则匹配,并将匹配到的内容绿色高亮输出出来,不匹配的内容红色高亮输出,并显示提示信息

其中,正则匹配表达式^\[(\d+)+\].+$ 匹配一组方括号 [ ] ,方括号后还有内容且方括号之间由数字组成:

  • 第一部分:^\[(\d+)+\]
    • ^\[ 表示以 [ 开头,\ 为转义字符
    • (\d+) +表示匹配多个数字,\ 为转义字符
    • \] 表示匹配右方括号,\ 为转义字符
  • 第二部分:.+$
    • .+ 表示匹配任意字符
    • $ 表示结尾

因此上面的正则表达式可以匹配:[123] this is a test line 这样的内容

我们来执行一下这个脚本,首先看下目标文件内容

# cat 1.txt 
[100001]咸鱼
[100002]kanye
11113344

在这里插入图片描述
由脚本的执行结果得知,文本文件中的内容均没有匹配到

奇怪,正则表达式写的没有问题,为啥脚本里面的正则不匹配呢

2.定位问题

在解决这个问题之前,我们先来了解一下正则表达式(Regular Expression)

什么是正则表达式

正则表达式是一种通用的文本匹配工具

它允许你使用特定的语法来描述和匹配文本中的模式,可以说是描述文本内容组成规律的表示方式

正则表达式的发展史

正则表达式的起源,可以追溯到早期神经系统如何工作的研究

在 20 世纪 40 年代,有两位神经生理学家(Warren McCulloch 和 Walter Pitts),研究出了一种用数学方式来描述神经网络的方法

1956 年,一位数学家(Stephen Kleene)发表了一篇标题为《神经网络事件表示法和有穷自动机》的论文。这篇论文描述了一种叫做「正则集合(Regular Sets)」的符号

随后,大名鼎鼎的 Unix 之父 Ken Thompson 于1968年发表了文章《正则表达式搜索算法》,并且将正则引入了自己开发的编辑器 qed,以及之后的编辑器 ed 中,然后又移植到了大名鼎鼎的文本搜索工具 grep 中

自此,正则表达式被广泛应用到 Unix 系统或类 Unix 系统 (如 macOS、Linux) 的各种工具中,但是百家争鸣的场面使得各种语言和工具中的正则虽然功能大致类似,但仍然有不少细微差别

正则表达式两种流派之 POSIX 流派

上个世纪八十年代,POSIX (Portable Operating System Interface) 标准公诸于世,它制定了不同的操作系统都需要遵守的一套规则

其中就包括正则表达式的规则,遵循 POSIX 标准的正则表达式,称为 POSIX 派系正则表达式

POSIX 规范定义了正则表达式的两种标准

  • 基本正则表达式 BRE(Basic Regular Expression)
    • 不支持量词问号和加号,也不支持多选分支结构管道符
  • 扩展正则表达式 ERE(Extended Regular Expression)
    • BRE 在使用花括号,圆括号时要转义才能表示特殊含义。由于BRE 功能不够强大,导致了 ERE 扩展标准的诞生

像 Unix 系统或类 Unix 系统上的大部分工具,如 grep 、sed 、awk 等都属于 POSIX 派系

BRE 标准和 ERE 标准

早期 BRE 与 ERE 标准的区别主要在于,BRE 标准不支持量词问号和加号,也不支持多选分支结构管道符

BRE 标准在使用花括号,圆括号时要转义才能表示特殊含义。BRE 标准用起来这么不爽,于是有了 ERE 标准,在使用花括号,圆括号时不需要转义了,还支持了问号、加号和多选分支

我们现在使用的 Linux 发行版,大多都集成了 GNU 套件。GNU 在实现 POSIX 标准时,做了一定的扩展,主要有以下三点扩展

  1. GNU BRE 支持了 +、?,但转义了才表示特殊含义,即需要用 \+、\? 表示
  2. GNU BRE 支持管道符多选分支结构,同样需要转义,即用 \| 表示
  3. GNU ERE 也支持使用反引用,和 BRE 一样,使用 \1、\2…\9 表示

在这里插入图片描述
POSIX 字符组

POSIX 流派还有一个特殊的地方,就是有自己的字符组,叫 POSIX 字符组
在这里插入图片描述
正则表达式两种流派之 PCRE 流派

除了 POSIX 标准外,还有一个 Perl 分支,随着 Perl 语言的发展,Perl 语言中的正则表达式功能越来越强悍,为了把 Perl 语言中正则的功能移植到其他语言中,我们熟知的 PCRE 就诞生了

PCRE 是一个兼容 Perl 语言正则表达式的解析引擎,是由 Philip Hazel 开发的,为很多现代语言和工具所普遍使用

除了 Unix 上的工具遵循 POSIX 标准,PCRE 现已成为其他大部分语言和工具隐然遵循的标准

目前大部分常用编程语言都是源于 PCRE 标准,这个流派显著特征是有 \d\w\s 这类字符组简记方式

在 UNIX/LINUX 系统里 PCRE 流派与 POSIX 流派的对比,可以参考下表
在这里插入图片描述
在 Linux 中使用正则

在遵循 POSIX 规范的 UNIX/Linux 系统上,按照 BRE 标准 实现的有 grep、sed 和 vi/vim 等

而按照 ERE 标准 实现的有 egrep、awk 等

但是在 Linux 的 bash 中,原生的正则表达式语法是基于 POSIX 标准的(支持 ERE 标准和 BRE 标准),不直接支持 PCRE 标准

在了解完正则表达式之后,我们再回到问题本身

脚本中的正则表达式出现了 \d ,而 \d 是属于 PCRE 标准,而 Linux Bash (基于 POSIX 标准)不支持 PCRE 标准,所以匹配不到

3.解决问题

知道了 Linux Bash 不支持 PCRE 标准,我们将脚本中的正则表达式由 PCRE 标准改成 ERE 标准即可

  • 改成 ERE 标准
regularExpression="^\[[0-9]].+$"
或者
regularExpression='^\[[[:digit:]]+\].+$'
  • 修改脚本:在脚本里面使用 grep 进行正则匹配过滤

    • -P 参数表示支持 PCRE 正则
    • -v 参数表示取反操作
#!/bin/bash
regularExpression="^\[(\d+)+\].+$"
content=$1
match_text=$(grep -P ${regularExpression} ${content})
dismatch_text=$(grep -Pv ${regularExpression} ${content})

echo -e "\033[32m 【 infomation matching  success! 】\n${match_text} \033[0m"
echo -e "\033[31m【 infomation dismatch !】${dismatch_text} \033[0m"

看下执行结果
在这里插入图片描述
参考链接:

  • 07丨正则有哪些常见的流派及其特性? | MRCODE-BOOK (zq99299.github.io)

  • https://askubuntu.com/questions/1143710/regex-with-d-doesn-t-work-in-if-else-statement-with

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

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

相关文章

一款多参数多合一的空气质量传感器【温湿度、TVOC甲醛CO2粉尘等】

档案馆库房专用的一款智能型空气质量云测仪 空气质量检测仪 空气质量传感器 环境集成传感器 集成/温湿度、粉尘PM2.5 PM10/甲醛/TVOC/CO2等高度集成的一款传感器/RS485信号输出 ◆温度测量参数: (1)温度测量范围: -40~80℃(2)输出分辨率:0.1oC (3)…

从零开始学架构——高性能负载均衡

高性能负载均衡 单服务器无论如何优化,无论采用多好的硬件,总会有一个性能天花板,当单服务器的性能无法满足业务需求时,就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单——通过增加更多的服务器来提升系…

Pandas入门实践1 -初探

我们将开始介绍Series、DataFrame和Index类,它们是pandas的基本构建块,并展示如何使用它们。在本节结束时,您将能够创建DataFrame并对它们执行操作以检查和筛选数据。 DataFrame剖析 DataFrame由一个或多个Series组成。Series的名称构成列名…

( “树” 之 DFS) 111. 二叉树的最小深度 ——【Leetcode每日一题】

111. 二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2…

matplotlib 笔记:subplot之间间距拉开

0 前情介绍 使用matplotlib的subplot时,由于默认间距不大,所以可能导致出的图会挤在一起 import matplotlib.pyplot as pltplt.subplot(221) plt.plot([1, 2, 3])plt.subplot(222) plt.bar([1, 2, 3], [4, 5, 6])plt.xlabel(xlabel, fontsize15, color…

码云私有仓库+宝塔面板部署WebHooks实现代码同步

权限问题,要分清楚两个帐号的权限www和root sudo -u www ssh -T gitgitee.com sudo -u root ssh -T gitgitee.com看清楚是用那个,建议用WWW帐号权限,不能用ROOT权限(最高权限不建议) 所以生成SSH是要注意要用那个帐号来生成: 一…

关于yolov7的一些理解

论文: https://arxiv.org/abs/2207.02696 Github: https://github.com/WongKinYiu/yolov7 YOLOV7的一些理解 1.摘要2.创新点3.具体工作3.1.网络结构优化3.2.辅助头训练3.3.标签分配策略3.4.重参数结构3.5.其它 1.摘要 Yolov7是Yolov4团队的作品,受到了yolo原作者…

Vue3瀑布流(Waterfall)

Vue2瀑布流&#xff08;Waterfall&#xff09; 可自定义设置以下属性&#xff1a; 图片数组&#xff08;images&#xff09;&#xff0c;类型&#xff1a;Array<{title: string, src: string}>&#xff0c;默认 [] 要划分的列数&#xff08;columnCount&#xff09;&a…

Linux下_多线程

线程 1. 为什么使用线程? 使用fork创建进程以执行新的任务&#xff0c;该方式的代价很高。多个进程间不会直接共享内存线程是进程的基本执行单元&#xff0c;一个进程的所有任务都在线程中执行&#xff0c;进程要想执行任务&#xff0c;必须得有线程&#xff0c;进程至少要有一…

11、响应数据

文章目录1、响应JSON1.1、引入开发场景1.2 、jackson.jar ResponseBody1、装填返回值处理器2、返回值初步处理3、获取并使用返回值处理器4、观察如何获取返回值处理器5、返回值处理器接口内部6、返回值处理器支持的类型7、返回值解析器原理1.3、HTTPMessageConverter 原理1、M…

c# 通过webView2模拟登陆小红书网页版,解析无水印视频图片,以及解决X-s,X-t签名验证【2023年4月15日】

一、c# WebView2简介 1.一开始使用WebBrowser&#xff0c;因为WebBrowser控件使用的是ie内核&#xff0c;经过修改注册表切换为Edge内核后&#xff0c; 发现Edge内核版本较低&#xff0c;加载一些视频网站提示“浏览器版本过低“&#xff0c;”视频无法加载“。 2.WebBrowser…

CentOS上PHP源码安装和配置

CentOS上PHP源码安装和配置 此文是在CentOS 7上已经部署了Nginx的基础上进行的 关于CentOS7上安装Nginx&#xff0c;可参考我之前的文章&#xff1a; CentOS上Nginx安装记录 我们现在在这个基础上安装PHP 7。 PHP里面概念挺多的&#xff0c;没想到安装这个PHP需要花那么多时…

SpringBoot 表单提交全局日期格式转换器

参考资料 SpringBoot–LocalDateTime格式转换(前端入参)SpringBoot InitBinder注解绑定请求参数 目录 一. 实现Converter<S, T>接口的方式二. 全局ControllerAdvice InitBinder注解的方式三. RequestMappingHandlerAdapter的方式四. 效果 分析 ⏹当前台的提交数据的Con…

JVM-0418

JVM-字节码篇 虚拟机体系结构 线程共享&#xff1a;堆、方法区 线程私有&#xff1a;虚拟机栈&#xff0c;本地方法栈&#xff0c;程序计数器。其中虚拟机栈中包括局部变量表&#xff0c;和操作数栈。 字节码文件概述 字节码文件是跨平台的吗&#xff1f; 是的 Java虚拟机…

Apache Log4j2(CVE-2021-4101)远程代码执行漏洞复现

文章目录前言影响范围黑盒发现复现准备JNDILADPRMI漏洞复现Dnslog数据外带使用工具进行反弹shell防御与绕过防御绕过参考前言 Apache log4j是Apache的一个开源项目&#xff0c;Java的日志记录工具(同logback)。 log4j2中存在JNDI注入漏洞&#xff0c;当程序记录用户输入的数据…

Qt Quick - FileDialog文件对话框

FileDialog文件对话框使用总结一、概述二、使用三、常用属性四、常用例子1. 单选打开文本文件2. 单选保存文本文件一、概述 FileDialog提供了一个基本的文件选择器的功能&#xff1a;它允许用户选择现有的文件或目录&#xff0c;或者创建新的文件名。 对话框最初是不可见的。…

【性能测试学习】2023最有效的7大性能测试技术(建议收藏)

进入互联网时代&#xff0c;性能测试显得越来越重要&#xff0c;移动应用、web应用和物联网应用都需要进行性能测试和性能调优&#xff0c;而进行性能和负载测试会产生了大量的数据&#xff0c;这些数据难以分析。除了数据分析&#xff0c;我们还会遇到其它一些困难和挑战。 今…

数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)

目录 二叉搜索树 二叉搜索树的一些操作函数 二叉搜索树的查找操作Find 递归实现 迭代实现 查找最大和最小元素 查找最小元素的递归函数 查找最大元素的迭代函数 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也称二…

深入了解 Hugging Face 中的生成工具:Generate方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SSH升级

升级openssh版本一、安装telnet远程管理主机1、检查是否安装telnet2、安装telnet服务二、下载所需的安装包1、下载openssl、openssh、zlib安装包2、安装所需的相关软件3、备份原来的数据4、复制文件到/usr/local/bin/下增加执行权限一、安装telnet远程管理主机 1、检查是否安装…