• 系统学习Shell之正则表达式


    目录

    什么是正则表达式

    基本正则表达式

    扩展正则表达式

    Perl正则表达式

    元字符优先级

    grep命令

    小结


    什么是正则表达式

    正则表达式是用来描述字符串匹配规则的工具。 选择出复合规则的文本,过滤掉不符合规则的文本,如下图所示:

    正则表达式的历史非常悠久,并且与UNIX有着不可分割的联系。1940年,美国新泽西州的Warrent McCuloch共和出生在美国底特律的Walter Pitts这两位神经生理学家,研究出了一种使用数学的方式来描述神经网络的方法。它们将神经系统中神经元描述成小而简单的自动控制元,这是正则表达式的雏形。1956年,美国数学家史蒂芬-科尔-克莱尼使用称为正则集合的数学符号来描述上述两位建立的模型,并由此引入正则表达式的概念。后来美国另外一位著名的计算机科学家肯-汤普逊,也就是大名鼎鼎的UNIX之父,将正则表达式引入了UNIX中的一个名为QED的编辑器中,后面有引入了另外一个非常流行的编辑器ed中。最后某些UNIX命令比如grep也提供了正则表达式的支持。目前正则表达式在Linux上得到了广泛的应用。常见的支持正则表达式工具有如下:

    • grep命令族:匹配文本行
    • sed流编辑器:改变输入流
    • awk:处理字符串语言
    • more, less:文件查看器
    • ed、vi\vim等:文本编辑器

    学习正则表达式主要学习它的元字符,元字符是指用来描述字符的字符。元字符的作用在于对字符表达式的内容、转换以及各种操作信息的描述。而正则表达式就是由各种元字符和一般字符构成的字符串。

    常见的正则表达式有3种:

    1. 基本正则表达式
    2. 扩展正则表达式
    3. Perl正则表达式

    下面我们一一介绍,它们支持的主要元字符

    基本正则表达式

    基本正则表达式(Basic Regular Expression, BRE)又称为标准正则表达式,是最早制定的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种是扩展正则表达式。

    基本正则表达式所定义的元字符又如下表几种:

    基本正则表达式元字符
    元字符说明
    ^行首定位符
    $行尾定位符
    .单个字符匹配符,用来匹配任意单个字符,包括空格,但是不包括换行符
    *一种限定符,限定符它本身不代表任何字符,它是用来指它前面的字符出现多少次才能满足匹配。而*表示匹配前面的字符任意次数,包括0次
    []

    字符集匹配,用来指定一个字符的集合

    对于连续的数字或者字母可以使用连字符-来表示以一个范围比如[1-9]表示1~9的任意整数,[a-f]表示匹配a~f中的任意一个字母。

    [^]字符集不匹配,与[]意思相反,匹配不满足这个字符集合的字符
    " role="presentation" style="position: relative;">

    定义子表达式的开始和结束位置。在后续的正则表达式中可以通过转义序列来引用子正则表达式。最多定义9个子表达式,比如:

    "love" role="presentation" style="position: relative;">love.*\1"表示匹配两个love中间包含任意字符的字符串。其中\1表示引用前面的love" role="presentation" style="position: relative;">love这个子表达式。

    x\{m,n\}区间表达式,匹配字符x重复次数区间,其中x\{n\}表示最多重复n次,x\{m,}表示最少重复m次,x\{m,n\}表示重复m~n次
    \<词首定位符
    \>词尾定位符

    扩展正则表达式

    扩展正则表达式(Extend Regular Expression ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的^,$,.,*,[],[^]这6个元字符ERE都支持,接下来重点介绍新增的一些元字符

    扩展表达式新增元字符
    元字符说明
    +限定符,与限定符*的意义基本相同,不同点在于+限定前面的字符必须出现至少1次
    限定符,限定前面的字符最多出现1次
    |和()

    竖线|表示多个正则表达式之间的关系,()表示一个集合,两个符号经常一起使用。比如:

    "(ssl|ssh|^yum)"表示匹配包含ssl的字符串或者包含ssh的字符串或者包含以yum行首的字符串

    ERE取消了子表达式"()"和次数匹配"{m,n}"语法符号的转义符引用,所以在ERE中,使用这两项元字符时,不需要像基本表达式中,"" role="presentation" style="position: relative;">",x\{m,n\}这样,需要去掉\转义字符。 

    Perl正则表达式

    Perl正则表达式的元字符与ERE的元字符大致相同,ERE的元字符Perl正则表达式都支持,另外Perl正则表达式还增加一些元字符 :

    Perl正则表达式新增元字符
    元字符说明
    \d数字匹配,和[0-9]效果一样
    \D非数字匹配,等价[^0-9]
    \s空白字符匹配,等价[\f\n\r\t\v]
    \S非空白字符匹配。等价于[^\f\n\r\t\v]

    元字符优先级

    正则表达式按照从左到右的顺序进行计算,并且遵循一定的优先级,这一点于算术运算符一样。所谓优先级表示在正则表达式,当多个元字符同时出现时,高优先级的元字符会被优先解释处理,下表列出了常用元字符的优先级,按照从高到低的顺序排列:

    正则表达式元字符优先级
    元字符说明
    \转义符
    []方括号表达式
    ()分组
    *,+,?,{m,n},{n},{m,}限定符
    普通字符按照从左到右的顺序
    ^,$,\>,\<定位符
    |或运算

    grep命令

    在Shell中,grep是与正则表达式关系非常密切的一条命令,我们可以使用它来测试验证我们的正则表达式。grep的语法如下:

    grep [options] pattern [file...] 

    option表示选项 ,pattern表示要匹配的模式,就是正则表达式的字符串,file表示一系列文件,常用的方法是用 | 管道将前面的命令的输出当作grep的输入。

    grep默认是用基本正则表达式,如果加上-E 表示用扩展正则表达式, -P 表示用Perl正则表达式

    常用的grep命令选项
    选项说明
    -c只打印匹配的行数,不显示匹配的内容
    -i匹配时忽略大小写
    -h搜索多个文件时,不显示匹配文件名前缀
    -l只列出含有匹配的文本行的文件名,不显示内容
    -n显示所有匹配的文本行不显示行号
    -s不显示关于不存在或者读取错误的文件信息
    -v只显示不匹配的文本行
    -w匹配整个单词
    -x匹配整个文本行
    -r递归搜索目录
    -q不输出匹配结果,只返回状态码表示是否搜索到
    -b打印匹配的文本行到文件头的偏移量,单位字节
    -E支持扩展正则表达式
    -P支持Perl正则表达式
    -F不支持正则表达式,按照字面意思匹配

    小结

    本篇文章主要解释了Shell中的正则表达式是什么,其中主要介绍了基本正则表达式,扩展正则表达式,Perl正则表达式,正则表达式还是需要多多练习。

  • 相关阅读:
    Android Apk 编译打包流程,了解一下~
    基于logistics回归的评分卡模型【相关理论】
    接口封装的几种方式
    SystemC入门学习-第3章 数据类型
    blender光照系统设置
    APP自动化测试-Appium Inspector入门操作指南
    React【异步逻辑createAsyncThunk(一)、createAsyncThunk(二)、性能优化、createSelector】(十二)
    封装一个文件切片上传——上传进度计算
    c++11新特性篇-委托构造函数和继承构造函数
    C语言关键字复习
  • 原文地址:https://blog.csdn.net/MashiMaroJ/article/details/126107439