原文地址:https://mp.weixin.qq.com/s/w5vlmMYsxC8cbvAiIqGZHQ
在数学中表达式由数字、运算符、分组符号也即括号和变量组成,由于变量的存在我们可以使用数学表达式对数值信息进行批量云算,从而高效的完成各种计算任务。同样的,批量处理文本信息我们也需要借助表达式以及起变量作用的特殊符号,这种表达式我们称之为正则表达式。正则表达式应用广泛,在很多计算机语言中都有涉及,今天主要带大家学习Bash中的正则表达式及其使用方法。
正则表达式,又称规则表达式(regularexpression,RE)通过一些特殊字符的排列用于查找、替换、删除符合某个模式(规则)的文本,是一种文本文件字符串处理的标准依据(一定要与通配符区分开,通配符主要用于文件管理)。很多工具命令以及软件都支持正则表达式,例如前面介绍的vim、grep以及后续要介绍的sed、awk等。许多程序设计语言也都支持利用正则表达式进行字符串操作,例如在Perl语言中就内建了一个功能强大的正则表达式引擎。因此,正则表达式对于处理文本数据非常重要。
接下来我们循序渐进,使用grep学习常用正则表达式的用法(一般使用LANG=C),可以使用下列命令:
wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.txtsed -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
在高级搜索中,常用中括号[]来集合字符,例如若想同时搜索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等文本处理的工具了。