zoukankan      html  css  js  c++  java
  • shell脚本——正则表达式

    什么是正则表达式  

      正则表达式分为基础正则和扩展正则,都是为了匹配符合预期要求的字符串

    正则表达式与通配符的区别

      只需要记住,对文件内容或是展示文本的操作都是正则,而对目录或文件名的操作则都是通配符(例如find指令)  

    基础正则和扩展正则

      扩展正则包含基础正则,而且多出了  +    ?   |    ()四个指令(注意这里的 | 要和管道符分开)

      扩展正则不需要像基础正则一样对某些符号进行转义(一般是用 反斜杠    来进行) 

    基础正则表达式符号

    符号 描述 实例
    . 代表单个字符(必须存在)

    a..b

    可以表示acdb

          aaab 、abbbb

    但不可以表示acb、ab、aba等

    *

    要和通配符区分开,匹配 * 前面一个字符的0个或多个

    *后面的字符一定要在*前面字符的后面

    另外*前后字符必须相邻否则匹配不到

    a*b

    可以表示ab、aab、b、abababab

    但不可以表示acb、ba等

    acb只会匹配到b,也就是视为b前面有0个a

    ba也只会匹配到b,同样视为b前面有0个a

    ^ 匹配 ^ 后面字符串开头

     输入:echo  -e  abcdaccc | grep "^ab"

    输出:abcd

    $  匹配 $ 前面字符串结尾  

     输入:echo  -e  abcdaccc | grep "cc$"

    输出:accc

     .*  匹配任意个字符(0到多个)

     a.*b

    和通配符里面的 * 大致类似

    可以代表ab、 acb、 a……b

    但不能代表b……a

     []

     表示范围,可以用来进行模糊匹配

    常用选项为【a-z】 【0-9】

    1.  grep【0-9】 text 过滤出含数字的行

    2.  grep【a-z】 text 过滤出含小写字母的行

    3.  grep 【abc】 text 过滤出含有a,b,c的行(注意这个abc是分别匹配,也就是相当于匹配含有a的行,b的行,c的行,并不是字符串abc的行

     {}

    {n,m}表示匹配 {} 前面字符的至少n个,最多m个 字符,注意:是连在一起的连续字符

    还可以为{n,}表示至少有n个

    {,m}表示最多有m个

     1.输入echo abbcdfbjk | grep -E "b{1,2}"

    输出 abbcdfbjk 

    2. 如果 输入 echo abbcdfbjk | grep -E "b{2,}"  #表示至少两个

    输出结果为 abbcdfbjk  可以看到只有连在一起的两个bb被匹配到,也就是说明了{}里面的数字表示的不是匹配到的个数,而是匹配字符的长度,像这个例子就是要求出现 b 的长度至少是2,所以只有 bb 被匹配到了

    3.  输入 grep -E "ac{2,5}b" 匹配a和b之间至少2个最多5个c的行,但是acb要连在一起

     【^】  【^a】表示匹配 a 以外的所有字符

     输入  echo  -e abc def lmn | grep "[^f-z]"

    输出  abc  def lmn,只有[a-e]配匹配到

     ^[^]  匹配 ^[^a]中的以a为开头以外的所有行  grep "^[^#]"  /etc/passwd   匹配  /etc/passwd  里面不以#开头的所有行
    <  ;  >

    锚定 单词首部 (尾部)  

    表示在匹配在首部(尾部)以空格或特殊字符为分隔的指定字符。如果同时锚定首尾  <  >  则表示这个字符的准确匹配,它的前后为特殊字符或空格分隔,不会和任何字符直接连接

    注意:必须要加 转义,即使使用扩展正则也要加    进行转义

     输入 :echo "hi,rootamroot" | grep "<root"
    输出:hi,rootamroot

    输入: echo "hiroot iamroot" | grep "root>"
    输出: hiroot iamroot

     输入: echo "hi,root  iamroot" | grep "<root>"
    输出:hi,root  iamroot

     ()

     1  调用前面的参数—第一个分组(也就是括号里的参数)

    如果用扩展正则则不需要 来进行转义

     

    过滤出一行中有两个相同数字的行

    # grep "([0-9]).*1"  /etc/passwd

    过滤出行首和行位字母相同的行

    # grep "^([a-z]).*1$" /etc/passwd

    a?表示前一个参数0个或1个

     
    +

    a+表示前一个参数1个或多个

     
    |

    (a|b)表示或的关系,a、b

     
  • 相关阅读:
    TP5报如下的错误 Indirect modification of overloaded element of thinkpaginatorCollection has no effect【转】
    PHPnumber_format()函数的使用
    蓝桥杯-PREV28-地宫取宝
    HihoCode-1053-居民迁移
    HihoCode-1323-回文字符串
    蓝桥杯-PREV3-带分数
    HDU-6312-Game
    HDU-6438-Buy and Resell
    CF-1117C-Magic Ship
    HDU-2802-F(N)
  • 原文地址:https://www.cnblogs.com/tomsongqi/p/11172676.html
Copyright © 2011-2022 走看看