📄 0330regularex.htm
字号:
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -in 'the' regular_express.txt</span>
8:I can't finish <span class="term_note_b">the</span> test.
9:Oh! <span class="term_note_b">The</span> soup taste good.
12:<span class="term_note_b">the</span> symbol '*' is represented as start.
14:<span class="term_note_b">The</span> gd software is a library for drafting programs.
15:You are <span class="term_note_b">the</span> best is mean you are the no. 1.
16:<span class="term_note_b">The</span> world <Happy> is <span class="term_note_b">the</span> same with "glad".
18:google is <span class="term_note_b">the</span> best tools for search keyword.
</pre></td></tr></table>
</li><br>
<li><span class="text_import1">例题二、利用 [] 来搜寻集合字元</span><br>
如果我想要搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 't?st'
存在~这个时候,我可以这样来搜寻∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 't[ae]st' regular_express.txt</span>
8:I can't finish the <span class="term_note_b">test</span>.
9:Oh! The soup <span class="term_note_b">tast</span>e good.
</pre></td></tr></table>
了解了吧?<span class="text_import2">其实 []
里面不论有几个字元,他都谨代表某『一个』字元</span>,
所以,上面的例子说明了,我需要的字串是『tast』或『test』两个字串而已!
而如果想要搜寻到有 oo 的字元时,则使用∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'oo' 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 tools for search keyword.
19:g<span class="term_note_b">oo</span>oooogle yes!
</pre></td></tr></table>
但是,如果我不想要 oo 前面有 g 的话呢?此时,可以利用在集合字元的反向选择 [^] 来达成<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '[^g]oo' regular_express.txt</span>
2:apple is my favorite <span class="term_note_b">foo</span>d.
3:<span class="term_note_b">Foo</span>tball game is not use feet only.
18:google is the best <span class="term_note_b">too</span>ls for search keyword.
19:go<span class="term_note_b">ooo</span>oogle yes!
</pre></td></tr></table>
意思就是说,我需要的是 oo ,但是 oo 前面不能是 g 就是了!
仔细比较上面两个表格,你会发现,第 1,9 行不见了,因为 oo 前面出现了 g 所致!
第 2,3 行没有疑问,因为 foo 与 Foo 均可被接受!但是第 18 行明明有 google 的 goo 啊~
别忘记了,因为该行后面出现了 tool 的 too 啊!所以该行也被列出来~
也就是说, 18 行里面虽然出现了我们所不要的项目 (goo) 但是由于有需要的项目 (too) ,
因此,是符合字串搜寻的喔!<br><br>
至于第 19 行,同样的,因为 goooooogle 里面的 oo 前面可能是 o ,例如∶
go(ooo)oogle ,所以,这一行也是符合需求的!<br><br>
再来,假设我 oo 前面不想要有小写字元,所以,我可以这样写 [^abcd....z]oo ,
但是这样似乎不怎么方便,由于小写字元的 ASCII 上编码的顺序是连续的,
因此,我们可以将之简化为底下这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '[^a-z]oo' regular_express.txt</span>
3:<span class="term_note_b">Foo</span>tball game is not use feet only.
</pre></td></tr></table>
也就是说,当我们在一组集合字元中,如果该字元组是连续的,例如大写英文/小写英文/数字等等,
就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文呢?
呵呵!就将他全部写在一起,变成∶[a-zA-Z0-9]<br><br>
例如,我们要取得有数字的那一行,就这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '[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>
这样对于 [] 以及 [^] 以及 [] 当中的 - 有了解了吗?! ^_^y
</li><br>
<li><span class="text_import1">例题三、行首与行尾字元 ^ $∶</span><br>
我们在例题一当中,可以查询到一行字串里面有 the 的,那如果我想要让 the 只在行首列出呢?
这个时候就得要使用定位字元了!我们可以这样做∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '^the' regular_express.txt</span>
12:<span class="term_note_b">the</span> symbol '*' is represented as start.
</pre></td></tr></table>
此时,就只剩下第 12 行,因为只有第 12 行的行首是 the 开头啊~此外,
如果我想要开头是小写字元的那一行就列出呢?可以这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '^[a-z]' regular_express.txt</span>
2:<span class="term_note_b">a</span>pple is my favorite food.
4:<span class="term_note_b">t</span>his dress doesn't fit me.
10:<span class="term_note_b">m</span>otorcycle is cheap than car.
12:<span class="term_note_b">t</span>he symbol '*' is represented as start.
18:<span class="term_note_b">g</span>oogle is the best tools for search keyword.
19:<span class="term_note_b">g</span>oooooogle yes!
</pre></td></tr></table>
如果我不想要开头是英文字母,则可以是这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '^[^a-zA-Z]' regular_express.txt</span>
1:<span class="term_note_b">"</span>Open Source" is a good mechanism to develop programs.
20:<span class="term_note_b">#</span> I am VBird
</pre></td></tr></table>
注意到了吧?那个 ^ 符号,在字元集合符号(括号[])之内与之外是不同的!
在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!要分清楚喔!<br><br>
那如果我想要找出来,行尾结束为小数点 (.) 的那一行,该如何处理∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '\.$' regular_express.txt</span>
1:"Open Source" is a good mechanism to develop programs<span class="term_note_b">.</span>
2:apple is my favorite food<span class="term_note_b">.</span>
3:Football game is not use feet only<span class="term_note_b">.</span>
4:this dress doesn't fit me<span class="term_note_b">.</span>
10:motorcycle is cheap than car<span class="term_note_b">.</span>
11:This window is clear<span class="term_note_b">.</span>
12:the symbol '*' is represented as start<span class="term_note_b">.</span>
15:You are the best is mean you are the no. 1<span class="term_note_b">.</span>
16:The world <Happy> is the same with "glad"<span class="term_note_b">.</span>
17:I like dog<span class="term_note_b">.</span>
18:google is the best tools for search keyword<span class="term_note_b">.</span>
</pre></td></tr></table>
特别注意到,因为小数点具有其他意义(底下会介绍),所以必须要使用跳脱字元(\)来加以解除其特殊意义!
不过,您或许会觉得奇怪,但是第 5~9 行最后面也是 . 啊~怎么无法列印出来??
这里就牵涉到 Windows 平台的软体对于断行字元的判断问题了!我们使用 cat -A 将第五行拿出来看,
您会发现∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">cat -A regular_express.txt</span>
However, this dress is about $ 3183 dollars.<span class="term_note_b">^M</span>$
</pre></td></tr></table>
注意到了没?最后面的断行字元应该是 $ 才对,但是,因为 Windows 的 nodepad 会主动加上 ^M
作为断行的判断,因此,那个 . 自然就不是紧接在 $ 之前喔!这样可以了解 ^ 与 $ 的意义吗?
好了,先不要看底下的解答,自己想一想,那么如果我想要找出来,哪一行是『空白行』,
也就是说,该行并没有输入任何资料,该如何搜寻??<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n '^$' regular_express.txt</span>
21:
</pre></td></tr></table>
因为只有行首跟行尾( ^$ ),所以,这样就可以找出空白行啦!再来,
假设您已经知道在一个批次脚本 (shell script) 或者是设定档当中,
空白行与开头为 # 的那一行是注解,因此如果您要将资料列出给别人参考时,
可以将这些资料省略掉,以节省保贵的纸张,那么,您可以怎么作呢?
我们以 /etc/syslog.conf 这个档案来作范例,您可以自行参考一下输出的结果∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">cat /etc/syslog.conf</span>
[root@test root]# <span class="term_command">grep -v '^$' /etc/syslog.conf | grep -v '^#'</span>
</pre></td></tr></table>
是否节省很多版面啊??
</li><br>
<li><span class="text_import1">例题四、任意一个字元 . 与重复字元 *</span><br>
在 bash 的章节当中,我们知道万用字元 * 可以用来代表任意(0或多个)字元,
但是<span class="text_import2">正规表示法并不是万用字元</span>,两者之间是不相同的!
至于正规表示法当中的『 . 』则代表『绝对有一个任意字元』的意思!这样讲不好懂,
我们直接做个练习吧!假设我需要找出 g??d 的字串,亦即共有四个字元,
起头是 g 而结束是 d ,我可以这样做∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'g..d' regular_express.txt</span>
1:"Open Source" is a <span class="term_note_b">good</span> mechanism to develop programs.
9:Oh! The soup taste <span class="term_note_b">good</span>.
16:The world <Happy> is the same with "<span class="term_note_b">glad</span>".
</pre></td></tr></table>
因为强调 g 与 d 之间一定要存在两个字元,因此,第 13 行的 god 与第 14 行的 gd
就不会被列出来啦!再来,如果我想要列出有 oo, ooo, oooo 等等的资料,
也就是说,至少要有两个 o 以上,该如何是好??是 o* 还是 oo* 还是 ooo* 呢?
虽然您可以试看看结果, 不过结果太占版面了 @_@ ,所以,我这里就直接说明。<br><br>
因为 * 代表的是『<span class="text_import2">重复 0 个或多个前面的 RE 字符</span>』的意义,
因此,<span class="text_import2">『o*』代表的是∶『拥有空字元或一个 o 以上的字元』</span>,
特别注意,因为允许空字元(就是有没有字元都可以的意思),因此, <span class="text_import1">
grep -n 'o*' regular_express.txt</span>
将会把所有的资料都列印出来萤幕上!<br><br>
那如果是『oo*』呢?则第一个 o 肯定必须要存在,第二个 o 则是可有可无的多个 o ,
所以,凡是含有 o, oo, ooo, oooo 等等,都可以被列出来~<br><br>
同理,当我们需要『至少两个 o 以上的字串』时,就需要 ooo* ,亦即是∶<br>
<table class="term"><tr><td class="term"><pre>
[root@test root]# <span class="term_command">grep -n 'ooo*' 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.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -