美文网首页
正则符号与通配符

正则符号与通配符

作者: ElephantKing | 来源:发表于2019-10-16 20:47 被阅读0次

    从两个简单的命令说开去

    *****a.txt begin*****
    ** abc
    ** adc
    ** ac
    ****a.txt end*****
    ls a?txt
    grep a.c a.txt
    grep a?c a.txt
    

    上面的第一个命令,能正确显示文件a.txt的属性,第二个命令能正确打印abcadc这两行,但是第三个命令输出为空。这里面涉及到三个东西:通配符,基础正则表示符,扩展正则标识符。

    通配符

    *:代表任意数量的任意字符
    ?:代表任意一个字符
    []:代表括号里的任意一个字符
    [-]:代表括号里表示的字符范围里的一个字符
    [^]:代表只要不是括号里的字符的任何一个字符
    
    栗子:
    ls *.txt
    ls [abc].txt
    ls [a-z].txt
    ls [^0-9].txt
    

    基础正则表示符

    ^:一行的开头
    $:一行的结尾
    .:任何一个字符
    \:跳脱字符,将特殊字符变为普通字符,使其失去特殊的意义
    *:重复前一个字符的任意次,不能单独使用
    []:括号里的任意一个字符
    [-]:括号里表示的字符范围里的任意一个字符
    [^]:不是括号里表示的字符范围的任意字符
    \{n,m\}:前一个字符的若干次重复
    
    栗子:
    grep ^abc a.txt        abc开头的行
    grep abc$ a.txt        abc结尾的行
    grep a.c a.txt         ac之间带任意字符的行
    grep a\$c a.txt        a$c的行
    grep a*c a.txt         a重复任意次后跟c的行
    

    扩展正则表示符

    +:前一个字符至少一次的重复
    ?:前一个字符0个或1个
    |:表示或
    ():找出群组
    ()+:群组重复任意次
    

    一个重要的原则

    如果一个命令支持基础正则或扩展正则,那么该命令使用的符号一律被认为是正则语法,而不被当做是通配符,否则命令中的字符将被当做通配符处理。
    回到开头的三个例子
    ls a?txt:ls不支持正则语法,所以这里的符号'?'就是一个统配符,表示任意一个字符,所以能检索出a.txt这个文件。
    grep a.c a.txt:默认只支持基础正则,所以这里能打印出任意ac之间包含一个字符的行(abc,adc..)。
    grep a?c a.txt:因为字符'?'是扩展正则里的,所以grep命令默认不支持,而把它当做一个普通字符,所以该命令只能打印出包含a?c的行,如果要打印包含任意个字符a后面紧跟一个字符c的行,需要让命令grep支持扩展正则,命令该写成:grep -E a?c a.txt

    哪些命令支持正则

    支持通配符:ls、cat、cp、mv、rm
    支持基础正则:grep、sed
    支持扩展正则:grep -E、sed -r、egrep、awk
    

    相关文章

      网友评论

          本文标题:正则符号与通配符

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