Linux Shell教程(二) 互动版

grep与正规表示法——字符类

从本小节开始,我们讲述grep与正规表示法的结合使用。后面的例子中会用到一个文件 regular_express.txt ,该文件的内容先以代码形式贴在这里:

"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.^M
GNU is free air not free beer.^M
Her hair is very beauty.^M
I can't finish the test.^M
Oh! The soup taste good.^M
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh! My god!
The gd software is a library for drafting programs.^M
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird

另外读者还可以自行到网上下载,只要在终端下使用如下命令:

 wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt

范例1字符类的搜索

如果我想要搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 't?st' 存在。这个时候,我可以这样来搜寻:

$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! The soup taste good.

其实 [] 里面不论有几个字节,他都仅代表某一个字节, 所以,上面的例子说明了,我需要的字串是 tast 或 test 两个字串而已!

范例2字符类的反向选择

如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,可以使用 [^] 来进行字符串的反向选择。

$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!

第 2,3 行没有疑问,因为 foo 与 Foo 均可被接受!

但是第 18 行明明有 google 的 goo 啊。别忘记了,因为该行后面出现了 tool 的 too 啊!所以该行也被列出来。也就是说, 18 行里面虽然出现了我们所不要的项目 (goo) 但是由于有需要的项目 (too) , 因此,是符合字符串搜索要求的!

至于第 19 行,同样的,因为 goooooogle 里面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,这一行也是符合需求的!

范例3连续字符的搜索

再来,假设我 oo 前面不想要有小写字节,所以,我可以这样写 [^abcd....z]oo , 但是这样似乎不怎么方便,由于小写字节的 ASCII 上编码的顺序是连续的, 因此,我们可以将之简化为底下这样:

$ grep -n '[^a-z]oo' regular_express.txt
3:Football game is not use feet only.

也就是说,当我们在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等等, 就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文呢?那就将他全部写在一起,变成:[a-zA-Z0-9]

根据本小节开头的说明建立 regular_express.txt 文件,并按照范例运行命令,查看结果是否与教程一致。