正则表达式

正则表达式在不同的工具和语言中会有差异,这里限定在POSIX标准的正则。

grep

Linux上的一个工具,名字来自于 “global regular expression print”,它能在输入文件中查找所有和正则匹配的文本行。用法是这样:

grep [options] regex [file …]
选项有很多,用到的 时候查就行了。

元字符和文本

元字符:^ $ . [ ] { } - ? + ( ) | \
其他的都是原义字符
注意:正则的有些元字符,对shell也有特殊含义,如
,在命令行输入的时候要加上引号,防止shell展开。

元字符含义

  • 任意字符(.)
    一个圆点,匹配任意字符。
  • 锚点(^ ,$)
    ^ 表示开头,$表示结尾。如 ^hello,表示匹配的字符串是以 hello 开头的;hello$,表示匹配的字符串是以 hello 结尾。

  • 中括号([ ])
    中括号给出一个集合表示在集合中的任意一个字符。
    如表达式 [AB]abc,表示要匹配的字符串是4个字符,最后三个是 abc,第一个是 A B中的一个。
    元字符如果出现在中括号中,就会失去原来的含义,变成普通字符。不过有两个特殊的,一个是 ^,它如果出现在中括号中的第一个字符(其他位置没有这个意义),表示对括号内的字符取反,匹配任意其他字符;另一个是 -,表示范围,这个稍微复杂一点,单独说。

  • 连字符(-)
    连字符表示一个范围。
    如表达式 [A-Z0-9a-z] ,可以将括号内的内容展开成所有大写字母,所有数字,所有小写字母,然后匹配其中任意一个。
    但若是 -在括号中的第一个字符,它就表示普通字符。
    使用连字符在某些情况下有可能会出现问题,这取决于系统中字符的顺序是字典序还是ASCII码的排序。为了能得到统一的结果,最好使用POSIX提供的字符集:

扩展的正则表达式

扩展的正则表达式包括了基本的正则表达式。
这里只写扩展的。在grep 后加上 -E 选项就是扩展的。

扩展的元字符

  • 可选(|)
    1
    $	echo "AAA" | grep -E 'AAA|BBB|CCC'

输出:AAA

‘^(bz|gz|zip)’ 表示以 “bz” “gz” “zip” 开头的字符串

  • ?
    匹配前面的元素一个或0个

  • +
    匹配前面的元素一个或多个

  • *
    匹配前面的元素0个或多个

  • {}
    匹配前面的元素,次数由括号内的内容定。
    n -> 匹配 n 个
    n, m -> 匹配 n~m 个
    n, -> 匹配 n~无穷个
    ,m -> 匹配0~m 个

其他

less 和 vim 都支持基本的正则表达式查找