第二章 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行符合条件。
正则表达式 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行符合条件。
相关阅读 更多 +