首页 > 系统相关 >bash shell 无法使用 perl 正则

bash shell 无法使用 perl 正则

时间:2023-04-15 09:55:40浏览次数:38  
标签:PCRE shell 正则表达式 perl 标准 正则 POSIX BRE bash

 

 哈喽大家好,我是咸鱼。今天跟大家分享一个关于正则表达式的案例,希望能够对你有所帮助

案例现象

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

 

 

 

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

 

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

 

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

  • 第一部分:^\[(\d+)+\]

    • ^\[ 表示以 [ 开头,\ 为转义字符

    • (\d+) +表示匹配多个数字,\ 为转义字符

    • \] 表示匹配右方括号,\ 为转义字符

  • 第二部分:.+$

    • .+ 表示匹配任意字符

    • $ 表示结尾

 

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

 

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

 

 

由脚本的执行结果得知,文本文件中的内容均没有匹配到

 

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

定位问题

在解决这个问题之前,我们先来了解一下正则表达式(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 标准

  • 修改脚本:在脚本里面使用 grep 进行正则匹配过滤
    • -P 参数表示支持 PCRE 正则

    • -v 参数表示取反操作

 

 看下执行结果

参考链接:

  • https://zq99299.github.io/note-book/regular/03/03.html#正则表达式简史

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

标签:PCRE,shell,正则表达式,perl,标准,正则,POSIX,BRE,bash
From: https://www.cnblogs.com/edisonfish/p/17320561.html

相关文章

  • Shell的变量
    1)Shell变量的名字可以由数字、字母和下划线组成,并且只能以字母或者下划线开头,如u_1,a12。    Shell变量有环境变量和用户自定义变量两种类型。在使用变量时变量名前加“$”。Shell的环境变量用来保存系统状态或环境参数的变量。Shell的系统变量是一种特殊的环境变量,主要......
  • shell练习3
    1.你需要打印一个给定的数字的反序,如输入10572,输出27501,如果没有输入数据,应该抛出错误和使用脚本说明。   2.写出SHELL函数RevertInput,函数必须获取三个参数,然后将三个参数倒序echo打印出来,函数必须检查参数个数的合法性,如果参数非法,打印”Illegalparameters”,对于下面的......
  • how to create one command line configuration tool with shell language on Linux A
    howtocreateonecommandlineconfigurationtoolwithshelllanguageonLinuxAllInOne如何在Linux上用shell语言创建一个命令行配置工具RaspberryPiconfigurationtool$sudoraspi-config#等价于,直接修改$sudovim/boot/config.txt$DISPLAY#设......
  • 走进shell
    走进shell1.进入命令行在图形化桌面出现之前,和Unix系统交互的唯一方式就是通过shell提供的文本命令行界面(commandlineinterface,CLI)。CLI只允许输入文本,而且只能显示文本和基本图形输出。1.1.控制台终端进入CLI的一种途径是访问Linux系统的文本模式。该模式只在显示器上提供......
  • bash shell基础命令
    bashshell基础命令很多Linux发行版的默认shell是GNUbashshell。1.启动shellGNUbashshell是一个程序,提供了对Linux系统的交互式访问。它是作为普通程序运行的,通常是在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。/etc/passwd文件包含了所有系统用户账......
  • 初识Linux shell
    初识Linuxshell1.Linux内核的组成Linux系统的核心是内核。内核控制着计算机系统的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。1.1系统内存管理​ 操作系统内核的主要功能之一是内存管理。​ 内核不仅管理服务器上的可用物理内存,还可以创建并管理虚拟内存(实际并......
  • Shell 脚本
    Shell脚本Shell编程跟JavaScript、php编程一样,只要有一个能编写的文本编辑器和一个能解释执行的脚本解释器就可以。Bash是大多数Linux系统默认的Shell一般情况下,不区分BourneShell和BourneAgainShell所以,像#!/bin/sh,它同样可以改为#!/bin/bash#!是告......
  • Xshell 免费下载使用教程
    小白教程新电脑要安装xshell,不想付费不想破解嫌麻烦怎么办,官方提供了免费版(家庭个人免费许可证),只要提供一个邮箱即可! 一 首先打开官方网站(https://www.xshell.com/zh/),切记其他网站下载的有广告或者病毒  二选择你自己适用的软件,看个人情况我这里就用xshell三选择......
  • 从零开始,轻松学习 Shell 编程!实用技巧带你一路飙升!
    欢迎来到《Shell脚本入门》教程!Shell脚本是一种用于自动化任务和批量处理的脚本语言,广泛应用于Unix和Linux系统中。在本教程中,我们将为您介绍Shell脚本的基础知识和使用方法。编辑第一部分:Shell脚本介绍Shell脚本是一种命令行脚本语言,用于在Unix和Linux操作系统中执行一系列命令。......
  • Xshell的使用
    (Xshell连接远程虚拟机后写命令和在那台虚拟机的命令行窗口写命令是没啥区别的)1.新建连接      2.点击连接  3.输入登录用户名  4.选择记住密码,方便下次连接  5.调整界面的字体大小 ......