正则表达式与文本处理类命令

来源:互联网 发布:算法导论是c语言 编辑:程序博客网 时间:2024/06/07 15:10

正则表达式与文本处理类命令

 

Regular Expression:正则表达式,又称规则表达式,在代码中常简写为regex、regexp或RE。计算机科学中的一个概念。正则表通常被用来检索、替换那些符合某个 pattren (模式、规则)的文本。
  正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展,演变成为计算机技术森林中的一只形神美丽且声音动听的百灵鸟。


  • 正则表达式与文本处理类命令
      •  
    • 正则表达式
      •  11 正则表达式相关名词释义
      •  12 正则表达式的作用  
      •  13 正则表达式的特点
      •  14 正则表达式的分类
      •  15 基本正则表达式grep
      •   格式及选项
      •   正则表达式的元字符
      •  16 扩展正则表达式egerp
      •   扩展正则表达式的元字符
      •  17 非正则表达式fgrep
      •  
    • 文本处理类命令wccutsortuniqdiffpatch
      •  21 wc word count文本统计命令
      •  22 cut 文本切割命令
      •  23 sort 文本排序命令
      •  24 uniq 报告或移除重复的行
      •  25 diff 比较不同文件间的差异
      •  26 patch 向目标文件打补丁
    • 反馈与建议


1. 正则表达式

  • 在长期使用Linux的众多用户间有三个广为流传的传奇般“人物”,他们被戏称为“Linux文本处理三剑客”,这三位鼎鼎大名的剑客分别为grep、sed、awk。其实这三位剑客是Linux中较为出名的三个文本处理工具,因为功能强大,扩展能力强而表现突出,故而得名。今天我们就来了解下三剑客之首——grep。

 1.1 正则表达式相关名词释义

  正则表达式:REGEXP,即 Rugual Exprission ,由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
  grep : Global search Regular expression and Print out the line ,文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,并打印匹配到的行。

  grep与glob的区别:glob是搜索文件名的,grep可以搜索文本内容,也可以配合其他命令(如管道或重定向)搜索文件名或其他指定字符串。

  pattren:模式:由正则表达式的元字符及文本字符所编写的过滤条件。

 1.2 正则表达式的作用  

  给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
    (1)给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
    (2)可以通过正则表达式,从字符串中获取我们想要的特定部分。
  

 1.3 正则表达式的特点

  正则表达式的特点:
    (1)灵活性、逻辑性和功能性非常的强;
    (2)可以迅速地用极简单的方式达到字符串的复杂控制。
    (3)对于刚接触的人来说,比较晦涩难懂。
  由于正则表达式主要应用对象是文本,因此它在各种文本编辑器场合都有应用,小到著名编辑器EditPlus,大到Microsoft Word、Visual Studio等大型编辑器,都可以使用正则表达式来处理文本内容。

 1.4 正则表达式的分类

  grep : 基本正则表达式
    选项-E –> egrep,
      -F –> fgrep,
    特点;特别适用于搜索PATTERN,搜索速度快,适用范围广;
  egrep : 扩展正则表达式
    选项-G –> egrep,
      -F –> fgrep,
    特点;语法简单,适用范围小;
  fgrep : 非正则表达式,使用于搜索文本;
    选项-E –> egrep,
      -G –> grep,
    特点;特别适用于搜索文本;

 1.5 基本正则表达式grep

  格式及选项

  grep命令格式:

    grep [OPTIONS] PATTERN [FILE]...    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]    OPTIONS:        --color=auto:对匹配到的文本着色后高亮显示;        -i : ignorecase , 忽略字符大小写;        -o : 仅显示匹配到的字符串本身;            注:grep命令默认显示匹配字符所在的整行;        -v : --invert-match , 屏蔽匹配到的行并显示其他行;        -E : -extended-regexp , 支持使用扩展正则表达式元字符;        -q : --quite,--slience , 静默模式,即不输出任何信息;        -A # : after  , 显示后#行        -B # : before ,显示前#行        -C # : context,显示前后各#行

  正则表达式的元字符

  基本正则表达式的元字符包括:字符匹配、匹配次数、位置锁定、分组及引用
  (1) 字符匹配
  .  :匹配任意单个字符
  [] :匹配指定范围内的任意单个字符
  [^]:匹配指定范围外的任意单个字符
  
  字符集:
    所有字符及数字; [[:alnum:]],
    所有数字; [[0-9]][[:digit:]],
    所有字母(大小写): [[:alpha:]][[:lower:]][[:upper:]],
    所有标点符号; [[:punct:]],
    空白字符; [[:space:]]

 【注意】非空白字符表示格式是 [^[:space:]] , 而不是 [^[[:space:]]] 。

  (2) 匹配次数 ;用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,(默认工作于贪婪模式)
  * :匹配其前面的字符任意次 ,0次1次或多次
    如: ~]# grep “x*y”
      abxy :匹配,x出现1次
      aby :匹配,x出现0次
      xxxxy:匹配,x出现4次
      yab :匹配,x出现0次
       其实只要字符中出现y就匹配。
       
  .* :匹配任意长度的任意字符
  \? :匹配其前面的字符0次或1次,即其前面的字符是可有可无的;
    如: ~]# grep “x\?y”
      abxy :匹配,x出现1次
      aby :匹配,x出现0次
      yab :匹配,x出现0次
      xxxxy:匹配,匹配最后一个xy
      其实只要字符中出现y就匹配。

  + :匹配其前面字符至少一次
  元字符来由:因 + 在shell命令中有其他含义,所以在正则表达式中需要用转义符 \ 将 + 转义;
  元字符功用:匹配其前面的字符1次或多次,即其前面的字符至少出现1次;

  \{m\} :匹配其前面字符至少m次
  元字符来由;因 {} 在shell命令中有其他含义,所以在正则表达式中需要用转义符 \ 将 {} 转义;
  元字符功用:匹配其前面的字符m次;
    如: ~]# grep “x\{1\}y”
      abxy :匹配,x出现1次
      aby :不匹配,x出现0次
      yab :不匹配,x出现0次
      xxxxy:匹配,匹配最后一个xy

  \{a,b\} :匹配其前面的字符至少a次,至多b次;
  \{0,b\} :至多匹配b次
  \{a,\} :至少匹配a次
    如: ~]# grep “x\{1,3\}y”
      abxy :匹配,x出现1次
      aby :不匹配,x出现0次
      yab :不匹配,x出现0次
      xxxxy:匹配,匹配内容;xxxy

  (3) 位置锚定 :指定匹配的字符的出现位置
    ^ : 行首锚定,用于模式的最左侧;
      ^PATTERN
    $ : 行尾锚定,用于模式的最右侧;
      PATTERN$
    ^PATTER$ : 用于模式匹配整行;
    \$ : 空行:也可以用 ^[:space:]*\$ 表示空行;
    \< : 或 \b ,词首锚定,用于单词模式的左侧;
    \> : 或 \b ,词尾锚定,用于单词模式的右侧;
    \< PATTERN >\ : 单词匹配,关键词搜索;

  (4) 分组及引用:
  
   \(\) :
  元字符来由;因 () 在shell命令中有其他含义,所以在正则表达式中需要用转义符 \ 将() 转义;
  元字符功用:将多个字符捆绑在一起,当做一个整体来匹配分组;

   \(xy\)*ab : 代表 xy 出现任意次;

  (5) 或 : 将扩展正则表达式的 | 转义后相同,即:
   \|
  后向引用;引用前面的分组括号中的模式所匹配的字符,(而非模式本身)【可理解为:将第一次匹配的结果在后面的匹配中多次使用】

   【Note】 : 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为;\1,\2,\3,…
   \1 : 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
   \2 : 从左侧起,第二个左括号以及与之匹配右括号之间的模式所匹配到的字符;
   \3 : 依此类推。
    如: grep \(ab\+(xy\)*\) /SOME/DIR中;
      \1 : ab\+\(xy\)*
      \2 : xy

 1.6 扩展正则表达式egerp

  扩展正则表达式的元字符

  支持扩展的正则表达式实现类似于grep文本过滤功能(grep -E) ;

    egrep [OPTIONS] PATTERN [FILE]...        --color=auto:对匹配到的文本着色后高亮显示;        -i : ignorecase , 忽略字符大小写;        -o : 仅显示匹配到的字符串本身;            注:grep命令默认显示匹配字符所在的整行;        -v : --invert-match , 屏蔽匹配到的行并显示其他行;        -G : -gexp , 支持基本正则表达式;        -q : --quite,--slience , 静默模式,即不输出任何信息;        -A # : after  , 显示后#行        -B # : before ,显示前#行        -C # : context,显示前后各#行

  扩展的正则表达式的元字符;字符匹配、匹配次数、位置锁定、分组及引用、或

  (1) 字符匹配 ; 【不同于grep,egrep中无需转义符 \ 】
  .  :匹配任意单个字符
  [] :匹配指定范围内的任意单个字符
  [^]:匹配指定范围外的任意单个字符

    字符集 :
      所有字符及数字; [[:alnum:]] = [[:0-9A-Za-z:]] = \w (w小写)
      除字符和数字外: [^[:alnum:]] = [^[:0-9A-Za-z:]] = \W (W大写)
      所有数字; [[0-9]] = [[:digit:]],
      所有字母(大小写): [[:alpha:]] = [[:lower:]] + [[:upper:]],
      所有标点符号; [[:punct:]],
      空白字符; [[:space:]]

  【注意】非空白字符表示: [^[:space:]]  ,而不是   [^[[:space:]]]  ;

  (2) 匹配次数 ;【不同于grep,egrep中无需转义符 \ 】用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,(默认工作于贪婪模式)
  * : 匹配其前面的字符任意次 ,0次1次或多次
    如: ~]# grep “x*y”
     abxy :匹配,x出现1次
     aby :匹配,x出现0次
     xxxxy:匹配,x出现4次
     yab :匹配,x出现0次
      其实只要字符中出现y就匹配。

  . :匹配任意长度的任意字符
  ? : 匹配其前面的字符0次或1次,即其前面的字符是可有可无的;
  + : 匹配其前面的字符1次或多次,即其前面的字符至少出现1次;
  {m} :匹配其前面的字符m次;
  {a,b} :匹配其前面的字符至少a次,至多b次;
  {0,b} :至多b次
  {a,} :至少a次(不要加空白字符)

【注意】传统的 egrep 不支持元字符 { ,并且一些 egrep 的实现通过支持 \{ 来代替它,因此可移植的脚本应当避免 在 egrep 中使用 { 模式,应当使用 [{] 来匹配一个字面意义 (literal) 的 { 。

 
  (3) 位置锚定 ;【与grep相同,都需要转义符 \ 】
   ^ : 行首锚定,用于模式的最左侧;
     ^PATTERN
   $ : 行尾锚定,用于模式的最右侧;
     PATTERNPATTERN : 用于模式匹配整行;
   *^$ : 空行:也可以用 ^[:space:]$ 表示空行;
   \< : 或 \b ,词首锚定,用于单词模式的左侧;
   \> : 或 \b ,词尾锚定,用于单词模式的右侧;
   \< PATTERN >\: 单词匹配,关键词搜索;

  (4) 分组及引用;【不同于grep,egrep中无需转义符 \ 】

   () : 分组,括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;
   
   后向引用;
     \1 : 第一个左括号和与之匹配的右括号
     \2 : 第二个左括号和与之匹配的右括号
     \3…

  (5) 或

   a|b… : a或者b;
     C|cat ; C或cat
     (c|C)at : cat或Cat

【注意】 grep -v 命令与  grep "[^]"   的区别;        grep -v : 代表显示某范围外的其他行;        grep "[^]" : 表示某模式范围外的单个字符;

 1.7 非正则表达式fgrep

  不支持正则表达式元字符;
  当不需要用到元字符去编写PATTERN时,使用fgrep性能更好;


 

2. 文本处理类命令:wc、cut、sort、uniq、diff、patch

 2.1 wc : word count,文本统计命令

    wc [OPTION]... [FILE]...        OPTION:            -l : lines            -w : words            -c : bytes

 2.2 cut : 文本切割命令

    cut OPTION... [FILE]...        OPTION:        -d CHAR   : 以指定的字符为分隔符 ;        -f FIELDS : 挑选出的字段(列);        # : 指定的单个字段;         #-# : 连续的多个字段;        #,# : 离散(不连续)的多个字段;

 2.3 sort : 文本排序命令

    sort [OPTION]... [FILE]...        OPTION:        -n : 基于数值大小而非字符进行排序;        -t CHAR : 以指定的字符为分隔符;        -k #   : 用于排序比较的字段;        -r : 逆序排序;        -f : 忽略字符大小写;        * -u : 重复的行只保留一份;    【注意】重复行 ;连续并且相同

 2.4 uniq :报告或移除重复的行

    nuiq [OPTION]... [INPUT[OUTPUT]]        OPTION:        -c : 显示每行的重复次数;        -u : 仅显示未曾重复过的行;        -d : 仅显示重复的行;

 2.5 diff : 比较不同文件间的差异

    diff [OPTION]... FILES    生成补丁的命令格式;    diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO PATCH_FILE        -u : 使用unfiled机制,即显示要修改的行的上下文,默认显示3行;

 2.6 patch : 向目标文件打补丁

    patch [OPTION] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE    patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE

反馈与建议

  • 微博:@我真的是阿初
  • 邮箱:achudk@qq.com
0 0
原创粉丝点击