📄 0330regularex.htm
字号:
3:F<span class="term_note_b">oo</span>tball game is not use feet only.
9:Oh! The soup taste g<span class="term_note_b">oo</span>d.
18:g<span class="term_note_b">oo</span>gle is the best t<span class="term_note_b">oo</span>ls for search keyword.
19:g<span class="term_note_b">oooooo</span>gle yes!
</pre></td></tr></table>
这样理解 * 的意义了吗?!好了,现在出个练习,如果我想要字串开头与结尾都是 g,
但是两个 g 之间仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等,
那该如何?<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'goo*g' regular_express.txt</span>
18:<span class="term_note_b">goog</span>le is the best tools for search keyword.
19:<span class="term_note_b">goooooog</span>le yes!
</pre></td></tr></table>
如此了解了吗?好,再来一题,如果我想要找出 g 开头与 g 结尾的字串,
当中的字元可有可无,那该如何是好?是『g*g』吗?<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'g*g' regular_express.txt</span>
1:"Open Source" is a good mechanism to develop programs.
3:Football game is not use feet only.
9:Oh! The soup taste good.
13:Oh! My god!
14:The gd software is a library for drafting programs.
16:The world <Happy> is the same with "glad".
17:I like dog.
18:google is the best tools for search keyword.
19:goooooogle yes!
</pre></td></tr></table>
但测试的结果竟然出现这么多行??太诡异了吧?
其实一点也不诡异,因为 g*g 里面的 g* 代表『空字元或一个以上的 g』
在加上后面的 g ,因此,整个 RE 的内容就是 g, gg, ggg, gggg ,
因此,只要该行当中拥有一个以上的 g 就符合所需了!<br><br>
那该如何得到我们的 g....g 的需求呢?呵呵!就利用任意一个字元『.』啊!
亦即是∶『g.*g』的作法,因为 * 可以是 0 或多个重复前面的字符,而 . 是任意字元,所以∶
『<span class="text_import1">.* 就代表零个或多个任意字元</span>』的意思啦!<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'g.*g' regular_express.txt</span>
1:"Open Source" is a <span class="term_note_b">good mechanism to develop prog</span>rams.
14:The <span class="term_note_b">gd software is a library for drafting prog</span>rams.
18:<span class="term_note_b">goog</span>le is the best tools for search keyword.
19:<span class="term_note_b">goooooog</span>le yes!
</pre></td></tr></table>
因为是代表 g 开头与 g 结尾,中间任意字元均可接受,所以,第 1 与第 14 行是可接受的喔!
这个 .* 的 RE 表示任意字元是很常见的,希望大家能够理解并且熟悉!<br><br>
再出一题,如果我想要找出『任意数字』的行列呢?因为仅有数字,所以就成为∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '[0-9][0-9]*' regular_express.txt</span>
5:However, this dress is about $ <span class="term_note_b">3183</span> dollars.
15:You are the best is mean you are the no. <span class="term_note_b">1</span>.
</pre></td></tr></table>
虽然使用 grep -n '[0-9]' regular_express.txt 也可以得到相同的结果,
但鸟哥希望大家能够理解上面指令当中 RE 表示法的意义才好!<br><br>
</li><br>
<li><span class="text_import1">例题五、限定连续 RE 字符范围 {}</span><br>
在上个例题当中,我们可以利用 . 与 RE 字符及 * 来设定 0 个到无线多个重复字元,
那如果我想要限制一个范围区间内的重复字元数呢?举例来说,我想要找出两个到五个 o
的连续字串,该如何作?这时候就得要使用到限定范围的字符 {} 了。
但因为 { 与 } 的符号在 shell 是有特殊意义的,因此,
我们必须要使用跳脱字符 \ 来让他失去特殊意义才行。<br><br>
至于 {} 的语法是这样的,假设我要找到两个 o 的字串,可以是∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'o\{2\}' regular_express.txt</span>
1:"Open Source" is a g<span class="term_note_b">oo</span>d mechanism to develop programs.
2:apple is my favorite f<span class="term_note_b">oo</span>d.
3:F<span class="term_note_b">oo</span>tball game is not use feet only.
9:Oh! The soup taste g<span class="term_note_b">oo</span>d.
18:g<span class="term_note_b">oo</span>gle is the best t<span class="term_note_b">oo</span>ls for search keyword.
19:go<span class="term_note_b">oo</span>ooogle yes!
</pre></td></tr></table>
这样看似乎与 ooo* 的字符没有什么差异啊?因为第 19 行有多个 o 依旧也出现了!
好,那么换个搜寻的字串,假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串,
他会是这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'go\{2,5\}g' regular_express.txt</span>
18:<span class="term_note_b">goog</span>le is the best tools for search keyword.
</pre></td></tr></table>
嗯!很好!第 19 行终于没有被取用了(因为 19 行有 6 个 o 啊!)。
那么,如果我想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'go\{2,\}g' regular_express.txt</span>
18:<span class="term_note_b">goog</span>le is the best tools for search keyword.
19:<span class="term_note_b">goooooog</span>le yes!
</pre></td></tr></table>
呵呵!就可以找出来啦~
</li>
</ul>
</div>
<hr><a name="basic_regexp_char"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">重要特殊字元(characters) </span><br>
<div class="block2">
经过了上面的几个简单的范例,我们可以将基础的正规表示法特殊字符汇整如下∶<br><br>
<table border cellspacing=0 cellpadding=0 width=90%>
<tr align=center bgcolor=#FFCCCC><td width=20%>RE 字符</td><td>意义与范例</td></tr>
<tr><td rowspan=2 align=center>^word</td><td>待搜寻的字串(word)在行首!</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>grep -n '^#' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻行首为 # 开始的那一行!</td></tr>
<tr><td rowspan=2 align=center>word$</td><td>待搜寻的字串(word)在行尾!</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>grep -n '!$' regular_express.txt</b></font><br>
<font color=#00AA00>将行尾为 ! 的那一行列印出来!</td></tr>
<tr><td rowspan=2 align=center>.</td><td>代表『任意一个』字符,一定是一个任意字符!</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>grep -n 'e.e' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻的字串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与
e 中间『一定』仅有一个字元,而空白字元也是字元!</td></tr>
<tr><td rowspan=2 align=center>\</td><td>跳脱字符,将特殊符号的特殊意义去除!</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>grep -n \' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻含有单引号 ' 的那一行!</td></tr>
<tr><td rowspan=2 align=center>*</td><td>重复零个或多个的前一个 RE 字符</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>grep -n 'ess*' regular_express.txt</b></font><br>
<font color=#00AA00>找出含有 (es) (ess) (esss) 等等的字串,注意,因为 * 可以是 0 个,所以 es
也是符合带搜寻字串。另外,因为 * 为重复『前一个 RE 字符』的符号,
因此,在 * 之前必须要紧接著一个 RE 字符喔!例如任意字元则为 『.*』 !</td></tr>
<tr><td rowspan=2 align=center>\{n,m\}</td><td>连续 n 到 m 个的『前一个 RE 字符』<br>
若为 \{n\} 则是连续 n 个的前一个 RE 字符,<br>
若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符!</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>grep -n 'go\{2,3\}g' regular_express.txt</b></font><br>
<font color=#00AA00>在 g 与 g 之间有 2 个到 3 个的 o 存在的字串,亦即 (goog)(gooog)</td></tr>
<tr><td rowspan=2 align=center>[]</td><td>字元集合的 RE 特殊字符的符号</td></tr>
<tr><td><font face="细明体">[list]<br>
范例∶<font face='细明体' color=#000088><b>grep -n 'g[ld]' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻含有 (gl) 或 (gd) 的那一行~<br>
需要特别留意的是,在 [] 当中『谨代表一个待搜寻的字元』,<br>
例如∶ a[afl]y 代表搜寻的字串可以是 aay, afy, aly <br>
亦即 [afl] 代表 a 或 f 或 l 的意思!</font><br><br>
<font face="细明体">[ch1-ch2]<br>
范例∶<font face='细明体' color=#000088><b>grep -n '[0-9]' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻含有任意数字的那一行!需特别留意,在字元集合 [] 中的减号 -
是有特殊意义的,他代表两个字元之间的所有连续字元!但这个连续与否与 ASCII 编码有关,
因此,您的编码需要设定正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变数是否正确!)
例如所有大写字元则为 [A-Z]</font><br><br>
<font face="细明体">[^]<br>
范例∶<font face='细明体' color=#000088><b>grep -n 'oo[^t]' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻的字串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,
代表的意义是『反向选择』的意思~例如,我不要大写字元,则为 [^A-Z] ~
但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来搜寻,
却发现该档案内的所有行都被列出,为什么?因为这个 [^A-Z] 是『非大写字元』的意思,
因为每一行均有非大写字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字元,
以及双引号 (") 等字元,所以当然符合 [^A-Z] 的搜寻!
</td></tr>
</table><br>
请特别留意的是,『<span class="text_import1">正规表示法的特殊字元</span>』
与一般在指令列输入指令的『<span class="text_import1">万用字元</span>』并不相同,
例如,在万用字元当中,* 代表的是 0 ~ 无限多个字元的意思,但是在正规表示法当中,
* 则是重复 0 到多个的前一个 RE 字符的意思~使用的意义并不相同,不要搞混了!
(鸟哥我一开始摸正规表示法时就很容易搞混!因为这里是新手最容易搞错的地方,特别小心啊!)<br><br>
举例来说,不支援正规表示法的 ls 这个工具中,若我们使用 『ls -l * 』
代表的是任意档名的档案,而 『ls -l a* 』代表的是以 a 为开头的任何档名的档案,
但在正规表示法中,我们要找到含有以 a 为开头的档案,则必须要这样∶(需搭配支援正规表示法的工具)<ul>
<font face="细明体"><b>ls | grep -n '^a.*' </b></font></ul>
另外,例如万用字元的反向选择,为 [!range] ,至于正规表示法则是 [^range] 。
这样是否了解正规表示法与万用字元的差异啦??<br>
</div>
</div>
<hr><a NAME="extend"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">延伸正规表示法</span><br>
<div class=block1>
事实上,一般读者只要了解基础型的正规表示法大概就已经相当足够了,不过,某些时刻,
为了要简化整个指令操作,了解一下使用范围更广的延伸型正规表示法的表示式,会更方便呢!
举个简单的例子好了,在上节的例题三的最后一个例子中,我们要去除空白行与行首为 # 的行列,
使用的是
<ul>grep -v '^$' regular_express.txt | grep -v '^#'</ul>
需要使用到管线命令来搜寻两次!
那么如果使用延伸型的正规表示法,我们可以简化为∶
<ul>egrep -v '^$|^#' regular_express.txt</ul>
利用支援延伸型正规表示法的 egrep 与特殊字元 | 来区隔两组字串,如此一来,是否方便很多呢?<br><br>
这里必须要特别强调, grep 支援的是基础型的正规表示法,而 egrep 支援延伸正规表示法。
事实上, egrep 是 grep -E 的命令别名,为了方便使用,我们还是以 egrep 来跟 grep 区分吧!<br><br>
熟悉了正规表示法之后,到这个延伸型的正规表示法,您应该也会想到,
不就是多几个重要的特殊符号吗? ^_^y 是的~所以,我们就直接来说明一下,延伸型正规表示法有哪几个特殊符号?<br><br>
<table border cellspacing=0 cellpadding=0 width=90%>
<tr align=center bgcolor=#FFCCCC><td width=20%>RE 字符</td><td>意义与范例</td></tr>
<tr><td rowspan=2 align=center>+</td><td>重复『一个或一个以上』的前一个 RE 字符</td></tr>
<tr><td>范例∶<font face='细明体' color=#000088><b>egrep -n 'go+d' regular_express.txt</b></font><br>
<font color=#00AA00>搜寻 (god) (good) (goood)... 等等的字串。
那个 o+ 代表『一个以上的 o 』所以,上面的执行成果会将第 1, 9, 13 行列出来。</td></tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -