# 延伸正则表示法

一般来说,只要了解了基础正则表示法大概就已经相当足够了,所谓技多不压身;还可以了解使用范围更广的延伸正则表示法。举个例子:前面讲解到要去除空白行与行首为 # 的行,使用的是

grep -v '^$' regular_express.txt | grep -v '^#'
1

需要使用到管线命令来搜寻两次,使用延伸的正则表示法则如下

egrep -v '^$|^#' regular_express.txt
1

此外,grep 预设仅支持基础的正则表示法,可以使用 -E 参数开启,不过建议用别名 egrep

下面是延伸正则表示法的符号(RE 字符)说明:

  • +:重复「一个或一个以上」的前一个 RE 字符

    范例:搜索 (god)(good)(goood)...等字符串。 可以使用

    [mrcode@study tmp]$ egrep -n 'go+d' regular_express.txt 
    1:"Open Source" is a good mechanism to develop programs!
    9:Oh! The soup taste good!
    13:Oh!  My god!
    
    1
    2
    3
    4
  • ?:「0 个或 1 个」的前一个 RE 字符

    范例:搜索 gd、god

    [mrcode@study tmp]$ egrep -n 'go?d' regular_express.txt 
    13:Oh!  My god!
    14:The gd software is a library for drafting programs!
    
    1
    2
    3
  • |:用或(or)的方式找出数个字符串

    范例:搜索 gd 或 good

    [mrcode@study tmp]$ egrep -n 'gd|good' regular_express.txt 
    1:"Open Source" is a good mechanism to develop programs!
    9:Oh! The soup taste good!
    14:The gd software is a library for drafting programs!
    
    1
    2
    3
    4
  • ():找出「群组」字符串

    范例:搜索 glad 或 good

    # 当然,这里使用上面完整的或来匹配两个固定单词也是可以的
    [mrcode@study tmp]$ egrep -n 'g(la)|(oo)d' regular_express.txt 
    1:"Open Source" is a good mechanism to develop programs!
    2:apple is my favorite food!
    9:Oh! The soup taste good!
    16:The world <Happy> is the same with "glad"!
    
    1
    2
    3
    4
    5
    6
  • ()+:多个重复群组的判别

    范例:将「AxyzxyzxyzxyzC」用 echo 叫出,然后再使用如下的方法搜索

    [mrcode@study tmp]$ echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)'
    Axyz xyzxyzxyzC # 在命令行中是有红色高亮的,这个只能高亮到 Axyz
    [mrcode@study tmp]$ echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+'
    Axyzxyzxyzxyz C # C 不会高亮
    [mrcode@study tmp]$ echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
    AxyzxyzxyzxyzC # 完全匹配
    
    1
    2
    3
    4
    5
    6

TIP

要特别注意:grep -n '[!>]' xx.txt 的含义并不是除了 > 字符之外的字符,因为 ! 不是一个特殊符号

想要表示非,需要这样写 grep -n '[^a-z]' xx.txt