美文网首页Linux入门linux学习
Linux学习--No.13正则表达式

Linux学习--No.13正则表达式

作者: 小贝学生信 | 来源:发表于2020-02-26 20:29 被阅读0次

    上一节提到根据文本模式进行sed编辑匹配行文本时,往往搭配正则匹配式进行高效检索、编辑。这一次来专门学习下正则表达式的相关知识。

    一、基本概念

    正则表达式为用户所定义的模式模板(pattern template),利用一系列通配符来描述数据流中的一个或多个字符。针对不同编程语言、应用程序等,正则表达式均有不同的类型,这正是其复杂且强大的原因。
    正则表达式是通过正则表达引擎(regular expression engine)来进行解释正则表达模式的。在Linux里,有两种流行的正则表达引擎:POSIX基础正则表达式(basic regular expression,BRE)与POSIX扩展正则表达式(extended regular expression,ERE)。

    二、BRE模式

    大多Linux工具均符合该引擎规范,有些只符合该规范的子集(比如之前学的sed编辑器)

    1、单纯文本匹配

    很好理解,但有以下两个注意点

    • 区分大小写;
    • 空格也被当做字符。
    echo "This is a test" | sed '/test/p'
    echo "This is a test" | sed '/te/p'
    echo "This is a test" | sed '/s a/p'
    

    上述代码均能返回下述结果

    This is a test
    

    2、特殊字符匹配(通配符)

    .*[]^${}\+?|()这些通配符在正则表达式里有特殊的含义。如果想把它们当做普通的文本字符,需要在前面加转义符反斜线(\)。有趣的是,反斜线本身就是一个特殊字符(也许就特殊在转义吧)

    2.1、脱字符^ 与美元符 $

    (1)脱字符^定义了行首开始的文本模式

    echo "This is a test" | sed '/^Th/p' 
    #定义了仅匹配以 Th 开头的行文本
    

    注意在上述用法中,脱字符^的位置必须要模式的开头(第一个正斜线后面),否则会被认为是文本字符。
    (2)美元符 $定义了行尾结束的文本模式

    echo "This is a test" | sed '/st$/p' 
    #定义了仅匹配以 st 结尾的行文本
    

    (3)联合使用,删除空白行

    sed '/^$/d' data1.txt    
    #删除data1.txt里的所有空白行
    

    2.2、点号.

    点号.代表了任意单个字符(可以是空格)。

    sed -n '/.at/p' data1.txt
    #含有hat、cat、bat等的文本行均可被匹配,但是以at开头的文本就不行
    

    2.3、方括号[ ]

    方括号[ ]依旧代表一个字符,不过必须属于方括号指代范围内的字符组之一。

    sed -n '/[chb]at/p' data1.txt
    #匹配含有cat、hat、bat的文本行
    sed -n '/[01234]at/p' data1.txt
    
    • 衍生用法1、方括号排除[^ ]
      依旧代表一个字符,但是要不属于方括号指代范围内的字符组。
    sed -n '/[^chb]at/p' data1.txt 
    #非c、h、b三种字母与at组合的均可,比如dat、eat、fat....甚至" at"
    
    • 衍生用法2、方括号区间范围
    sed -n '/[0-9]56/p' data1.txt
    sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data1.txt    #用于查找仅由5个数字组成的行文本
    #用于查找仅由5个数字组成的行文本
    
    sed -n '/[a-m]at/p' data1.txt
    sed -n '/[a-mq-y]at/p' data1.txt  
    #定义两个选择区间 a-m与q-y
    

    2.4、星号*

    星号*放在某字符后面,表明该字符出现了0次或多次。常用!

    sed -n '/at*s/p' data1.txt  
    # 比如可以匹配as、ats、atts等
    

    不过,它更常见的用法是放在句尾,用来查找一些列拥有相同前缀/后缀的文件(类似于锚字符)

    ls -lh li*
    

    除了上述自定义模式外,BRE还包括一些特殊的字符组,可用来匹配特定类型的字符(p434),比如[[:alpha:]] 代表匹配任意字母字符,不论大小写。


    • 此外还有POSIX扩展正则表达式(extended regular expression,ERE)向Linux应用与工具提供了一些额外的符号,比如gawk编辑器能够识别ERE模式。这里简单介绍下这些符号:
      (1)问号 ? 类似于*星号 区别在于问号仅允许前面的字符出现0次或1次;
      (2)加号 +也类似于*星号 区别在于问号仅允许前面的字符出现1次或多次;
      (3)花括号{ } 允许为可重复的正则表达式指定一个上限;
      (4)管道符号| 允许用逻辑OR的方式指定正则表达式引擎要用的两个或多个模式。

    以上是关于Linux正则表达式的简单学习。寒假Linux的学习暂时就告一段落吧,要开始学校网课的学习了~ 加油!
    参考教材《Linux命令行与shell脚本编程大全》

    相关文章

      网友评论

        本文标题:Linux学习--No.13正则表达式

        本文链接:https://www.haomeiwen.com/subject/jqbichtx.html