首页 > 代码库 > 详解正则表达式以及文本处理工具—grep、egrep的用法和特性

详解正则表达式以及文本处理工具—grep、egrep的用法和特性

一、grep

(1)grep简介

grep:全称是Global search REgular expression and Print out the line,全局搜索正则表达式并输出合适的行。

grep是一种强大的文本搜索工具,根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,显示能匹配到的行。(只对文本进行搜索处理)

Unix的grep家族包含grep、egrep和fgrep。

(2)grep的用法

语法格式:grep [option]... ‘PATTERN‘ FILE...

                选项       文本模式     文件

   命令选项:

      --color=auto :自动标记颜色(对匹配到的字符串标记颜色,默认是红色)

      -v: 反向选取(只显示没有被匹配到的行)

      -o: 仅显示匹配的字串,而非字串所在的行

      -i: (ignore-case)忽略字符大小写

      -A # :显示匹配到的行和该行的后#行 (#表示数字)

      -B # :显示匹配到的行和该行的前#行

      -C # :显示匹配到的行、该行的前#行和该行的后#行

      -E: 支持使用扩展正则表达式(相当于使用egrep命令)

grep不是拿整行匹配的,是按字串匹配的。(当在一行中第一次匹配到指定的字符串时,它不会直接跳到下一行再去匹配,而是在本行继续往后匹配。)

grep工作于贪婪模式:尽可能多的去匹配

wps_clip_image-23823

要想使用grep的高级用法,须结合正则表达式和管道一起使用。因此,接下来让我们拨开迷雾,走进正则表达式的花园。

二、正则表达式简介

正则表达式:

     正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。

     正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

            其实正则表达式就是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等功能;

元字符:

     正则表达式中具有特殊意义的专用字符(类似于C语言中的关键字);

     不表示其字面意义,而用于额外功能性描述

分类:

     正则表达式分为两类: “基本正则表达式”和“扩展正则表达式”

     grep内置“基本正则表达式”的功能,也可以使用grep -E 利用“扩展正则表达式”的功能。

     egrep内置“扩展正则表达式”的功能。

     fgrep: 不支持使用正则表达式

三、基本正则表达式

基本正则表达式的元字符:

(1)字符匹配:

    .: 匹配任意单个字符

        wps_clip_image-29481

    []: 匹配指定范围内的任意单个字符

           [0-9], [[:digit:]]  (单个0-9的数字)

                  [a-z], [[:lower:]]  (单个小写字母)

                  [A-Z], [[:upper:]]  (单个大写字母)

                  [[:space:]]  (空格)

                  [[:punct:]]  (单个标点符号)

                  [[:alpha:]]  (单个字母,包括大小写)

                   wps_clip_image-29639

            [[:alnum:]] (单个数字或字母)

    [^]:匹配指定范围内外的任意单个字符

(2)次数匹配元字符:用于实现指定其前面的字符所能够出现的次数

     *: 任意长度,它前面的字符可以出现任意次

     \?: 0次或1次,它前面的字符是可有可无的

    \{m\}: m次,它前面的字符要出现m次

    \{m,n\}: 至少m次,至多n次(m<n)

    \{m,\}:至少m次

    \{0,n\}: 至多n次

    .*:任意长度的任意字符

  wps_clip_image-24154

(3)位置锚定:

    ^: 行首锚定;写在模式最左侧

    $: 行尾锚定:写在模式最右侧

          ^$: 空白行

          wps_clip_image-31177(查找有空白行的,有才会显示)

    \<: 锚定词首,出现于单词左侧,也可用\b

    \>: 锚定词尾,出现于单词右侧, 也可用\b

(不包含特殊字符的连续字符组成的串叫单词)

(4)分组:

    \(\) :分组的格式

       wps_clip_image-29876

    分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用。

    引用有编号:自左而后的左括号,以及与其匹配右括号(不管内嵌多少个括号,都是从左到右编号的。)

         例如,\(a\(b\(c\)\)mn\(x\)\).*\1  (\1引用的是第一个左括号以及与其匹配右括号间匹配的内容)

    \#: 引用第n个括号所匹配到的内容,而非模式本身(#表示数字)(如,\(ab\(x\).*\2 : \2引用的是\(x\)的匹配内容)

        例如:

           \(ab\?c\).*\1

          abcmnaaa        abcmnabc(匹配成功)  abcmnac        acxyac(匹配成功)

四、扩展正则表达式

egrep内置“扩展正则表达式”的功能,也可使用grep -E 利用“扩展正则表达式”的功能。

         grep -E  ‘PATTERN‘ FILE...

         egrep ‘PATTERN‘ FILE...

(1)字符匹配:

       . :匹配单个任意字符

       [] :匹配指定范围内的任意单个字符

      [^] :匹配指定范围外的任意单个字符

(2)次数匹配:

      *:任意次

      ?: 0次或1次(可有可无)

      +: 至少1次;(相当于基本正则表达式的\{1,\})

    {m}: 精确匹配m次

    {m,n}: 至少m次,至多n次(m<n)

    {m,} : 至少m次

    {0,n} :至多n次

(3)位置锚定:

    ^ :行首锚定

    $ :行尾锚定

    \<, \b :词首锚定

    \>, \b :词尾锚定

    ^$, ^[[:space:]]*$ :空白行

(4)分组:

    () :

    同样可使用引用:\1, \2, \3

    | :或者(扩展正则表达式特有的)

       例如:a|b表示a或者b

              conC|cat :表示conC或cat

              con(C|c)cat :表示conCat 或 concat

                 wps_clip_image-16443

本文出自 “恒则有成” 博客,请务必保留此出处http://hjqjk.blog.51cto.com/5970897/1437663