美文网首页
Linux - 正则表达式

Linux - 正则表达式

作者: 熊猫人和熊猫猫 | 来源:发表于2019-08-06 15:55 被阅读0次

    正则表达式(Regular Expression,RE)是透过一些特殊字符的排列,用以[搜寻/取代/删除]一列或多列文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项“表达式”。如果想要以正则表达式的方式处理字符串,就要使用支持正则表达式的工具程序,例如 vi,grep,sed,awk等。但是像cp,ls等指令并不支持正则表达式,所以就只能使用bash自己本身的通配符。

    注意:

    • 正则表达式的符号与通配符是完全不一样的东西
      因为通配符(wildcard)代表的是bash操作接口的一个功能,但正则表达式则是一种字符串处理的的表示方式。两者要分清楚啊~
    • 语系对正则表达式有影响
      因此在使用正则表达式时,要特别留意当时环境的语系为何,否则可能会发现与别人不相同的撷取结果。

    下面关于正则表达式的练习和举例,都使用我们熟悉的grep来展示,grep是一个撷取命令,如果你不了解grep,可以从这篇小文章里简单了解一些Linux 之 Bash -- 管线命令

    grep 的一些进阶选项
    之所以这么说,是因为Linux 之 Bash -- 管线命令里面都没有提到~~
    工作模式:grep [-A] [-B] [--color=auto]'搜寻字符串' filename
    -A 后面可加数字,为after的意思,除了列出该行外,后面的n行也列出来
    -B 后面可加数字,为before的意思,除了列出该行外,前面的n行也列出来
    --color=auto 可将正确的那个撷取数据列出颜色

    1.基础正则表达式

    下面总结了一个精简的基础正则表达式的字符表格,不过不要局限于其中的范例啊,还要根据实际情况灵活改变,它的价值可远不止于此~

    表达式 描述 范例
    ^ 行首标记 ^test 匹配以 test 起始的行
    $ 行尾标记 test$ 匹配以 test 结尾的行
    . 任意字符 t.t匹配任意代替.的一个字母(它就是英文状态的句号),如txt,但不能是两个字母如text
    [] 匹配其中任意一个 t[ex]t匹配 tet 或 txt
    [^] 除了其中任意一个 te[^xt] 除了 tet 和 txt 不能匹配,其他任意
    [a-d] 匹配指定范围内任一个 能匹配a,b,c,d中任意一个字母
    {n} 匹配之前n项 grep -w '[0-9]\{2\}' filename 撷取存在两位数字的文本行
    {n,m} 最少匹配n次,最多m次 [0-9]\{2,4\} 匹配2位数到4位数
    {n, } 至少匹配前面n次 [0-9]\{n, \}匹配至少是两位数的
    * 匹配之前多个或没有 tx*t 匹配 tt 或 txt/txxt/txxxt/...
    \ 转义(向来放在特殊符号前,* + ?等) bio\ +info 匹配bio+info

    [^]表示反向选择
    [^a-z]表示非小写字母
    ^[]表示定位在行首
    ^[a-z]表示行首非小写字母
    ^$表示空白行
    g..d代表共4个字符,开头为g,结尾为d(.代表绝对有一个任意字符)
    g.*g代表g开头且g结尾的字符串
    [0-9][0-9]*表示任意数字
    go\{2,5\}g 表示g后面接2-5个o和一个g的字符串(因为{}在shell中有特殊意义,所以用\来跳脱。这也是为什么👆表格的大括号{}都写成了\{\}
    ls -l . | grep '^l'列出当前目录下的链接文档
    (利用了链接文档的一个特性,其标头会是 lrwxrwxr)

    再次提醒:正则表达式的 原字符*通配符* 不是一回事哦

    • 通配符中,它代表0-无穷多个字符
    • 正则表达式中,它代表匹配0-无穷多个的前一个RE字符

    2.延伸正则表达

    一般来讲,了解基础型的正则表达式已经能够帮助我们解决很多问题了。不过,某些时刻为了要简化整个指令操作,使用范围更广的延伸型正则表达会更加方便。
    eg:延伸型正则表达可以透过群组功能‘|’来进行一次搜寻,其中的管道符|意义为“或 or”。不过,grep预设仅支持基础正则表达式,如果要使用延伸型正则表达,可以使用grep -E 或者 egrep。我觉得后者使用起来更方便哦(不用来回切换大小写~)

    表达式 描述 范例
    + 匹配之前1个或多个 tx+t 匹配 txt 或 txxt/txxxt/...
    匹配之前1个或没有 te?xt 只能匹配 txt 或 text
    | 用或的方式找出字符串 gd|god|good匹配gd,god,good
    () 匹配括号中的字符串 bio(info)? 匹配 bio 或 bioinfo
    ()+ 多个重复群组的判别 A(xyz)+C 匹配AxyzC或AxyzxyzC等...

    相关文章

      网友评论

          本文标题:Linux - 正则表达式

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