zoukankan      html  css  js  c++  java
  • 正则表达式

    正则表达式是通过正则表达式引擎实现的,linux有2种流行的正则表达式引擎:

    1.POSIX基本正则表达式(BRE)引擎

    2.POSIX扩展正则表达式(ERE)引擎

    大多数linux工具都至少符合POSIX BRE引擎规范,有些工具,如sed只实施了BRE的子集,gawk使用ERE引擎来。

    BRE模式

    1.纯文本

     支持文本,且 区分大小写、支持空格。

    2.特殊字符

    可识别^、$等特殊字符,如果要单独使用,需要在前面加进行转义。

    #echo 'The cost is $4.00' | sed -n '/$/p' 

    The cost is $4.00

    备注:/不是特殊字符,但在sed或gawk中使用时需要转义

    #echo "3 / 2" | sed -n '///p'

    3 / 2

    3.锚字符

       ^ :锚定行首,此字符后面的字符必须出现在行首

      $:锚定行尾,此字符前面的字符必须出现在行尾

     或<:锚定词首,此字符后面的字符必须作为单词开始

    或>:锚定词尾,此字符前面的字符必须作为单词结束

    #匹配以Book开始的行
    # echo "Books are great" | sed -n '/^Book/p' 
    Books are great
    
    组合锚定:
    1.匹配特定的行
    #sed '^this is a test$'
    2.删除文件空白行
    #sed '/$^/d' testfile

    #匹配以w开头的单词
    #echo 'hello world, hello beijing.' | sed -n '/<w/'
    hello world, hello beijing.

    3.点字符:.号

    匹配任意单个字符(包括空格),除换行符

    #echo 'this is a cat'  | sed -n ‘/.at/p’

    this is a cat

    4.星号:*

    匹配前1字符任意次,包括0次

    #echo 'ik' | sed -n '/ie*k/p'
    ik
    #echo 'iek' | sed -n '/ie*k/p'
    iek
    #echo 'iek' | sed -n '/ie*k/p'
    ieek
    1.用于不同语言拼写差异,如:美式英语、英式英语的colour和color表示同一意思
    #echo 'I'm getting a color TV' | sed -n '/colou*r/p'
    I'm geting a color TV
    #echo 'I'm getting a colour TV' | sed -n '/colou*r/p'
    I'm geting a colour TV
    
    2.点号与星号连用,0到多个任意字符
    #echo 'You are a boy.' | sed -n '/You.*boy/p'
    You are a boy.
    #echo 'Youboy' | sed -n '/You.*boy/'p
    Youboy
    
    3.星号和字符组组合,指定文本中出现多个的一组字符或一个字符区间
    #echo 'bt'  | sed -n '/b[ae]*t/p'
    bt
    #echo "bat" | sed -n '/b[ae]t/p'
    bat
    #echo "baakkt" | sed -n '/b[ae]t/p'  #出现的kk非字符组中的字符,所以不匹配。

    5.字符组:[]

        []:匹配[]中的任意字符

           [acd157]  匹配a、c、d、1、5、7的任意一个

           [a-ch-m]  匹配a到c、h到m之间的任意一个(指定多个区间)

           [0-3]       匹配0-3(指定单个区间)

       [^]:匹配[]中的任意字符外的其他字符

             [^a-b]  #匹配除a-b之外其特所有单个字符

      特殊字符:

       [:alpha:]   匹配任意字母,即A-Z和a-z

       [:lower:]   匹配任意小写字母

       [:upper:] 匹配任意大写字母

       [:alnum:]  匹配任意字母和数字,即0-9、A-Z、a-z

       [:digit:]   匹配0-9数字

       [:space:] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR

       [:blank:] 匹配空格或制表符

       [:print:] 匹配任意可打印字符

       [:punct:] 匹配标点符号

        这些特殊字符在字符组中,表现为:[[:digit:]]

    典型案例:
    1.不清楚字符大小写时用
    #echo "yes"  | sed -n '[Yy]es'
    yes
    #echo "Yes"  | sed -n '[Yy]es'
    Yes
    
    2.多个字符组连用(多个字符都不知道大小写)
    #echo "yEs"  | sed -n '[Yy][Ee][Ss]'
    yEs
    
    3.匹配任意数字
    #echo "abc123" | sed  -n '/[[:digit:]]/p'
    abc123

    5.聚合表达式:()

     ()中的内容必须匹配

    #echo "start"  |  sed -n '/st(art)/p'

    start

    备注:BRE使用聚合分组时,需要对园括号进行转义

    聚合组引用:

    1:引用第1个聚合组

    2:引用第2个聚合组

    #echo "start abc start" | sed '/st(art) abc st1/p' 

    start abc start

    备注:

          BRE也支持ERE的?、+、|、{}用法,只是需要使用反斜杠进行转义

    ERE模式

    ERE支持BRE的所有内容,新增如下内容:

    1.问号

    匹配前1字符0次或1次

    #echo 'bet' | gawk '/be?t/{print $0}'    #echo bt也可匹配,echo beet则不会被匹配
    
    bet
    
    问号与字符组一起使用
    
    #echo 'bat'  | gawk '/b[ae]?t/{print $0}'  #表示问号前的字符组中任意字符出现0-1次
    
    bat   

    2.加号

       匹配前一字符1次或多次,至少1次。

    #echo ‘bet’  | gawk '/be+t/{print $0}'    #bt不匹配,beet匹配

    bet

    3.花括号:{}
      指定前1字符出现的次数

      {m,}  #前1字符至少出现m次

      {m}  #前1字符只出现m次

      {m,n} #前1字符至少出现m次,最多出现n次

    示例:
    
    1.grep
    #echo ''beeet" | grep -E 'be{3}t'
    2.gawk
    #echo "beeet" | gawk --re-interval '/be{1,3}t/{print $0}' #gawk要支持{},需要--re-interval
    

    4.管道符:|

      多个模式之间使用|,任何一个模式匹配则匹配成功

    #echo "The cat is asleep"  | gawk '/dog|cat/{print $0}'
    
    The cat is asleep
    
    #echo "The dog is asleep" | gawk '/dog|cat/{print $0}'
    
    The dog is asleep
    

    5.聚合表达式

       参见BRE,只是不需要对圆括号进行转义。

      

      

      

    111
  • 相关阅读:
    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序
    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1
    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句
    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
    047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用
    046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项
    045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围
    剑指OFFER----面试题04.二维数组中的查找
    剑指OFFER----面试题03. 数组中重复的数字
  • 原文地址:https://www.cnblogs.com/zmdsg/p/7070265.html
Copyright © 2011-2022 走看看