正则表达式:正则表达式是以行为单位处理字符串的一种方法。它可以藉由一些特殊符号的使用,可以让使用者轻易达到“查找/删除/替换”某特定字符串的功能。

    由于使用的语系中英文字母,数字的编码顺序不同,所以会对正则表达式的处理结果产生影响,所以我们在使用正则表达式时,都是使用兼容POSIX的标准。为了避免英文字母、数字编码的不同对字符截取产生的影响,底下的特殊字符需要牢记!

[:alnum:]英文字符和数字A-Z,a-z,0-9
[:alpha:]英文字符A-Z,a-z
[:digit:]数字0-9
[:xdigit:]16进制的数字0-9,A-F,a-f
[:upper:]大写英文字符A-Z
[:lower:]小写英文字符a-z
  •  [ ]搜索集合字符

    示例:

    grep -n 'goo[dg]' /tmp/test.txt

    此命令会显示出test.txt文件中包含good或goog字符串的行并显示行号;

    '[]'表示[]内字符合集中的某一个字符,[a-z]表示一个小写英文字符,[0-9]表示一个数字字符。

  • 反向选择符^

    示例:

    grep -n '[^a-z]ood' /tmp/test.txt

    此命令会显示出test.txt文件中包含ood但ood前面不是小写英文字符的行,并显示行号;

    为了避免由于语系字符编码的不同而导致的问题,此命令可以等同于:

    grep -n '[^[:lower:]ood' /tmp/test.txt

    注意此处'^'所处的位置是在集合字符[]内部

  • 定位字符:行首符'^'和尾符'$'

    示例:

    grep -n '^first' /tmp/test.txt

    此命令会显示出test.txt文件中包含first且first位于行首的行,并且显示行号;

    注意此处'^'所处的位置不在集合字符[]内部

    grep -n '^[^[:upper:]]' /tmp/test.txt

    此命令会显示出test.txt文件中行首不是大写英文字符的行,并显示行号;

    注意此命令中两个'^'的位置,以及它们表示的意思!!

    grep -n ';$' /tmp/test.txt

    此命令会显示出test.txt文件中以';'结尾的行,并显示行号;

    grep -n '^$' /tmp/test.txt

    此命令会显示出test.txt文件中的空行,并显示行号;

  • 任意一个字符'.'和重复字符'*'

    .(小数点):表示一定有一个任意的字符;

    *(星号):重复前面的字符0到无穷次;

    示例:

    grep -n 't..t' /tmp/test.txt

    此命令会显示出test.txt文件中包含以字符t开头和结尾并且中间有2个任意字符的行,并显示行号;

    grep -n 'goo*g' /tmp/test.txt

    此命令会显示出test.txt文件中包含以字符g开头和结尾并且中间有至少1个字符o的行,并显示行号;

    grep -n 'g.*g' /tmp/test.txt

    此命令会显示出test.txt文件中包含以字符g开头和结尾的行,并显示行号;

  • 限定连续重复字符{}

    由于shell中字符{}有特殊意义,所以在这里要使用转移字符\

        示例:

        grep -n 'go\{2\}g' /tmp/test.txt

        此命令会显示test.txt文件中出包含字符串goog的行,并且显示行号;

        grep -n 'go\{2,5\}g' /tmp/test.txt

        此命令会显示test.txt文件中出包含字符串goog,gooog,goooog或gooooog的行,并且显示行号;

遗留问题:如何找出包含2个重复英文字符形如"aa"、"bb"的行,并显示行号;

        此处要用到扩展正则表达式,命令如下:

        egrep -ni '([a-z])\1' /tmp/test.txt

        此处的'\1'表示反向引用前面圆括号内匹配的内容

  • 常规正则表达式元字符总结:

    []字符合集中的任意一个字符,[abc]匹配a或b或c
    [^]排除字符合集中的所有字符,[^abc]匹配除了a或b或c之外的字符
    ^行首符,^hello匹配以hello开头的行
    $行尾符,hello$匹配以hello结尾的行
    .匹配任意一个字符,g..d匹配g开头d结尾且中间有2个字符的字符串,如:good、glad、gadd
    *匹配前导字符0到无穷次,goo*g匹配gog、goog、gooog....
    \{n,m\}

    匹配前导字符n到m次;

    \{n\}:匹配前导字符n次;

    \{n,\}:匹配前导字符至少n次;

    扩展正则表达式元字符:

    +匹配前导字符1次或1次以上,go+g匹配gog、goog、gooog.....
    ?匹配前导字符0次或1次,go?g匹配gg、gog
    |用or的方式找出数个匹配的字符串goog|hello|test匹配goog或hello或test
    ()找出群组字符串,g(oo|la)d匹配good或glad
    ()+匹配()内容1次或1次以上,(very)+good匹配verygood、veryverygood....
    ()\1反向引用()的内容,([a-c])\1匹配aa、bb、cc,即用()的内容代替\1

    当然扩展正则表达式也需要工具程序的支持才能使用,比如grep就不支持扩展正则表达式,要用egrep指令才行。