在数学领域,表达式由数字、运算符、括号和变量构成。通过变量的使用,我们能够对数值信息进行批量计算,从而高效地完成各种计算任务。同样地,在处理文本信息时,我们也需要借助表达式和特殊符号,这些特殊符号在文本处理中扮演着变量的角色。这种表达式被称为正则表达式。正则表达式在多个计算机语言中都有广泛应用,本文将重点介绍在bash中使用正则表达式的方法。
正则表达式,也被称为规则表达式(Regular Expression, RE),利用特定字符的排列来查找、替换、删除符合特定模式(规则)的文本,是文本文件字符串处理的标准依据(需注意与通配符区分,通配符主要用于文件管理)。许多工具命令和软件都支持正则表达式,例如vim、grep、sed和awk等。此外,许多编程语言也支持使用正则表达式进行字符串操作,例如perl语言内置了一个强大的正则表达式引擎。因此,正则表达式在处理文本数据时具有重要作用。
接下来,我们将逐步学习使用grep来掌握常用正则表达式的用法(一般使用LANG=C)。可以使用以下命令获取练习数据:
wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt sed -i 's/^M//' regular_express.txt #注意,上面命令中的^M输入方法为先Ctrl+V后Ctrl+M
该文件内容如下所示:
"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. GNU is free air not free beer. Her hair is very beauty. I can't finish the test. Oh! The soup taste good. 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. 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</happy>
⑴集合字符[]
在高级搜索中,常用中括号[]来集合字符。例如,如果想同时搜索test和taste这两个关键词,可以使用t[ae]st:
搜索含有oo但前面不是g(即去除goo)的行:
搜索含有oo但前面不是小写字母的行:
在正则表达式中,所有连续的字符组均可以这样表达,例如[a-z]、[A-Z]、[0-9]。如果不在C语系中,可以使用[:lower:]、[:upper:]、[:digit:]分别代表小写字母、大写字母、数字:
⑵行首行尾字符^$
字符^可以限定行首,而$可以限定行尾。例如,要筛选行首为the的行(忽略大小写):
筛选行首不是字母的行:
需要注意的是,上述两个^的含义是不同的。筛选行尾是r.的行:
因为正则表达式中“.”具有特殊意义,所以需要“”来转义。为了节省屏幕空间,去除空白行和行首为#的注释行:
⑶任意字符.与重复字符*
与通配符不同,在正则表达式中.代表一个任意字符,而*代表重复前一个字符0到无穷多次。例如,我们想查找含有g??d的行:
筛选至少含有两个o的行:
利用重复字符可以表示任意字符“.*”,例如筛选g开头与g结尾的字符串,中间字符可有可无:
筛选含有任意数字的行:
⑷限定连续字符范围{}
在正则表达式中{}可以用来界定连续字符的范围,但是由于在shell中{}具有特殊意义(数组引用),因此需要“”来进行转义。例如,筛选含有2个o的字符串:
查找g后面接2-6个o,然后再接一个g的字符串:
掌握正则表达式的使用后,我们就可以进一步学习sed、awk等文本处理工具了。