+ -

第二章 linux工具箱 笔记

时间:2006-01-09

来源:noping

在手机上看
手机扫描阅读
实用程序  utilities program
正则表达式  regular expression
元字符集  metacharacters
模板  pattern
POSIX  portable operating system interface for computer eaving ment
计算机环境的可移植操作系统界面
模板匹配  pattern-mactching

2.1 正则表达式

  正则表达式只是一个字符模板,用来在搜索中匹配相同的字符。

  example
  $ vi  letter
  -------------------------------------------------------------------
   Hi tom,
   I think I failed my anatomy test yesterday.I had a terrible
   stomach ache. I ate too many fried green tomatoes.
   Anyway, Tom, I need your help. I''d like to make the test up
   tomorrow, but don''t know where to begin studying. Do you
   think you could help me? After work, about 7 PM, come to
   my place and I''ll treat you to pizza in return for you help.
   Thanks.
                                            your pal,
                                            guy@phantom
   ------------------------------------------------------------------
   如果我们发现Tom并没有参加考试,而是David参见的考试。我们不需要一个个的来修
   改文章中的名字。
  
   :1,$s/tom/David/g

   : 冒号命令 在vi中调用ex(一个行编辑器)。 1,$ 从第一行到行尾。 s 替换。       /tom/David 将tom替换为David。g 在该行上所有符合模板的部分全部做替换。

   上一个命令虽然解决了大部分问题,但是仍有错误存在

   1. 因为是tom被替换成David。所以Tom并没有被按希望的所替换。
   2. 如果在单词中出现tom也将会被替换。比如tommorw就被替换成了Davidorrow。
      这并不是我们所希望要做的替换。

   :1,$s/\<[T,t]om\>/David/g

   \< 锚定单词的开始 \> 锚定单词的结尾 [] 指定了字符的范围
  
   [注:书中说 g (golbal)标志表示在这个命令对于全文有效。跟在别的书中解释不
        同。个人认为后部出现的 g 应该解释为在这一行上都有效。因为vi调用的是
       ex 一个行编辑器。如果是 :g 这里的g 是全文的意思。而在后部的 g 是本行的
       意思。也就是说本行上所有符合模板的字符将被替换,而不是第一个出现的模板]

   再翻译一遍上面的命令: 从文本的第一行到最后一行 1,$ , 替换 s, 字符首部被锚
   定为 \< , [T,t]om Tom or tom,\> 尾部锚定 的单词为 David。所有该行上
   符合条件的模板都会被替换。 1,$ 再加上尾部的g 正好构成全文的意思(从第一行到
   最后一行,每一行上所有符合模板的字符)。

 2.1.2 正则表达式的元字符集

    一套是基本元字符集  basic regular expression
    一套是扩展元字符集  extened regular expression
    POSIX 也有一套元字符集

    ^ 锚定行的开始     
    $ 锚定行的结束
    . 匹配一个单个字符
    * 代表0个或多个先前的字符
    [] 匹配字符组中的一个字符
    [x-y] 匹配以字符范围组成的组中的一个字符
    [^] 匹配一个不在范围内的字符
    \ 用来转义一个元字符集
    \< 锚定单词的开始
    \> 锚定单词的结束
    \(\) 标记后面用到的匹配字符
    x\{m\} m次复制字符x
    x\{m,\} 至少m次复制字符x
    x\{m,n\} 至少m次,至多n次复制字x
   
    [x-y]中的字符范围是根据ASCII码来划定的。0-9 小于A-Z . A-Z 小于 a-z的   ASCII码值. 不能出现 [9-0],[a-Z]这样的范围. 前面字符的ASCII码值必须小于后面字符的ASCII码值.

    正则表达式中的元字符不要跟shell的通配符搞混。*在shell中代表任意的字符,而在正则表达式中代表的是0个或多个先前的字符。

2.2  正则表达式元字符的组合

example

该例子使用 :set number 前面的行号不属于文本内容
---------------------------------------------------------------------
1 Christian Scott lives here and will put on a Christmas party.
2 There are around 30 to 35 people invited.
3 They are:
4                                       Tom
5 Dan
6     Rhonda Savage
7 Nicky and Kimberly.
8 Steve, Suzanne, Ginger and Larry.
---------------------------------------------------------------------
1 /^[A-Z]..$/
行首为一个大写字母,后面跟两个任意字符,然后是新的一行。第5行符合条件。

2 /^[A-Z][a-z]*3[0-5]/
行首为一个大写字母,后面跟着0个或多个小写字母,然后是数字3,最后是一个介于0-5之间的一个数字。第2行符合条件。
(书中是错误的)因为第2行中有空格。而[a-z]*3只匹配小写字母并不匹配空格。
/^[A-Z][^A-Z]*3[0-5]/ [^A-Z]匹配所有非大写字母

3 /[a-z]*\./
0个或多个小写字母,后面跟着一个点号。第1,2,7,8行符合条件。

4 /^ *[A-Z][a-z][a-z]$/
行首后面是0或多个空格,后面跟着一个大写字母和两个小写字母,紧跟着一个新行。第4,5行符合条件

5 /^[A-Z,a-z]*[^,][A-Z,a-z]*$/
行首为0个或多个小写或大写字母,行中间没有,号,然后有跟着0个或多个小写或大写字母。第5行符合条件。

2.21 更多的正则表达式元字符

example
:set number
---------------------------------------------------------------------
1 Unusual occurences happened at the fair.
2 Patty won fourth place in the 50 yard dash square and fair.
3 Occurences like this are rare.
4 The winning ticket is 55222.
5 The ticket I got is 54333 and Dee got 55544.
6 Guy fell down while running around the south bend in his last
7 event.
~
~
--------------------------------------------------------------------

1 /\<fourth\>/
查找匹配fourth的行。第2行符合条件。

2 /\<f.*th\>/
查找以字母f开头后面跟着0个或多个任意字符,最终以th结尾的行。第2,6行符合条件

3 :1,$s/\([O,o]ccur\)ence/\1rence/
注 书中有错误 在例子中单词已经是occurrence 应改为 occurence
 
在1到$最后一行替换s \([O,o]ccur\)ence Occurence or occurence 为
Occurrence or occurrence 。主要的是在\([O,o]ccur\)中的 [O,o]ccur 被标记。因为这是在第一个模板中标记得,因此称为tag1。这个模板被保存在内存存储器中,
叫做寄存器1。先把\1用tag1中的内容替换,在把单词的其他部分(rence)附加到它的后面。第1,3行发生了替换。

4 :1,$s/\(square\) and \(fair\)/\2 and \1/
将square标记为tag1,将fair标记为tag2。将square and fair 替换成
fair and square。第2行发生了替换。

5 /5\{2\}2\{3\}\./
查找5出现2次,2出现3次,后面跟着.的行。 第4行符合条件。


热门下载

更多