有关正则表达式(grep)浅析
正则表达式:是对字符串处理的一种依据,然而那些字符已经没有了其字面意义,而具有了控制或者通配的功能。其中元字符不表示其字面意义,而用于额外功能性描述
基本正则表达式引擎:grep
语法格式: grep[option]...'PATTERN'FILE...
使用--color=auto可是匹配到的字符变色当然可以使用alias替换,如#alias“grep=grep--color=auto”
基本正则表达式的字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[[:digit:]]:仅代表数字
[[:lower:]]:仅代表小写字母还可以这样表示:[a-z]
[[:upper:]]:仅代表大写字母还可以这样表示:[A-Z]
[[:space:]]:代表空白字符,也可表示空格
[[:punct:]]:仅代表标点符号
[[:alpha:]]:代表字母不分大小写[a-zA-Z]
[[:alnum:]]:代表大小写字母及数字[a-zA-Z0-9]
[^]:表示取反
位置锚定:
^:行首锚定;写在模式最左侧
$:行尾锚定:写在模式最右侧
^$:空白行
不包含特殊字符的连续字符组成的串叫单词:
\<:词首,出现于单词左侧,\b
\<char
\>:词尾,出现于单词右侧,\b
char\>
下面我们坐下练习,了解一下他们都是怎么使用的。我使用nano创建一个文档tea.txt
cat一下如下图
先来grep一下以小写字母开头的行,那么就会用到行首锚定^和[[:lower:]]组合起来
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/3C/B6/wKiom1PCP4zyovAaAABePa9oBeg801.jpg">
还可以这样表示
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M02/3C/B5/wKioL1PCP12D9KgxAABV2HjQGP4014.jpg">
如果想找出以大写字母开头的行则是把上面小写字母表示换成大写字母表示的形式即可。
下面我们找出空白行,可以使用^和$表示
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M01/3C/B6/wKiom1PCP43CF73eAAAzOiKoJWM701.jpg">
当然空白行还可以空白开头且以空白结尾,使用[[:space:]],如下
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/3C/B5/wKioL1PCP17j29HIAABEQGQhzdw720.jpg">
接下来看一下怎么找出非字母结尾的行这就要用到[^],[[:alpha:]],和$组合形式
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M02/3C/B6/wKiom1PCP43BXmcEAABqZBx9oB0762.jpg">
不难发现所找出的是符号和数字结尾的行。注意:这里面取反和行开头符区分开,比如说我们找到非字母开头的行如下
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M01/3C/B5/wKioL1PCP16jRIhZAABt8K0l0sM855.jpg">
没有出现红色的则是以空白开头的行。
学了上面查找方法我们不难找出含o的行如下图
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/3C/B6/wKiom1PCP46R-uatAABm3CgQNe0631.jpg">
不管含多少o的行都找到了,那么要找至少含两个o的行怎么找?这就要引入次数匹配元字符了。次数匹配元字符就用于实现指定其前面的字符所能够出现的次数
*:任意长度,它前面的字符可以出现任意次
例如:a*b,
a可以出现任意次0,1,2,3......即可匹配到b,ab,aaab
\?:0次或1次,它前面的字符是可有可无的
例如:a\?b
可以匹配到b,ab,当然aaab也可匹配到
\{m\}:m次,它前的字符要出现m次
例如:a\{2\}b
ab,aab,b,aaaab中就可以匹配到aab,aaaab
\{m,n\}:至少m次,至多n次
例如:a\{2,5\}b
ab,b,aab中只能匹配到aab
\{m,\}:至少m次
\{0,n\}:至多n次
.*:任意长度的任意字符
下面看些练习,我们找出上面tea.txt文档中含两个相邻o的行我们就要使用到\{m\}模式了
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/3C/B6/wKiom1PCP47RcZIsAABQ_XAQsDY109.jpg">
可见我们找的还不少,只要有俩相邻o都可以找到,第二行有一个o没变色,我们可以总结为:查找时从左至右去匹配的被匹配过的就不在参与匹配要想让那三个o都变色的话,就得换种查找方式,查找至少两个o相邻的行,则使用\{m,\}模式。
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M02/3C/B5/wKioL1PCP1-BCLWYAABU4875weI210.jpg">
分组的目的就是方便引用。由括号和转移符组成,例如:\(ab\)*。分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用,引用的并非模式本身而是所匹配道德内容。
\#:引用第n个括号所匹配到的内容,而非模式本身。例如:\(ab\?c\).*\1这里的1表示第一个左括号所匹配的内容;\(ab\(c\)\).*\2,2表示第二个左括号及与之相对应的右括号中的所匹配到的内容
我们就找一下tea.txt中\(ab\?c\).*\1
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M01/3C/B6/wKiom1PCP4_C6-vbAABL1oFHC7Y547.jpg">
在其中b可出现0次或者一次,匹配到的第一行所匹配的内容是abc,其中的dxy是.*内容。
有些时候我们需要借助一些命令选项会更好的理解和使用grep,下面是一些命令选项:
-v:反向选取
-o:仅显示匹配的字串,而非字串所在的行
-i:ignore-case,忽略字符大小写
-A#所显示本行及下#行
-B#所显示本行及上#行
-C#所显示本行及上下#行
-E:支持使用扩展正则表达式
命令选项使用方法做如下练习,
-v :取反,在tea.txt中找出非字母结尾的行
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/3C/B5/wKioL1PCP1_C9HMOAAB-zOgzTX8284.jpg">
-o:匹配子串,找出test子串
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M02/3C/B6/wKiom1PCP4_gBVizAABKMvUCIas676.jpg">
-i:忽略字母大小写,如找出以t开头的行不分大小写
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M01/3C/B5/wKioL1PCP2CiudTMAABWJU92hB4447.jpg">
-A#:显示所匹配到行以及下#行,如下练习,找出以g开头的行并且显示出下三行
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/3C/B6/wKiom1PCP5CR6_pLAABZwmr-0LE374.jpg">
-B#:显示匹配到的行及上#行,如下练习,找出以g开头的行并且显示出上三行
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M02/3C/B5/wKioL1PCP2DzamCZAABLXygOnFA065.jpg">
-C#:显示匹配到的行及上下#行,如下练习,找出以g开头的行并且显示出上下三行
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M02/3C/B5/wKioL1PCP2GiI3OxAAByDjXxFnM805.jpg">
-E的使用,可以转换成扩展正则表达式
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M01/3C/B6/wKiom1PCP5DgiHaVAABdt4FxkZ8075.jpg">
扩展正则表达式:
其表示方法:
grep-E'PATTERN'FILE...
egrep'PATTERN'FILE...
在扩展正则表达式中,其锚定和字符匹配与基本正则表达式形式相同,次数匹配和分组有所不同,可以不用转移符。可总结如下:
*:前面相邻一个字符任意次
?: 前面相邻字符0次或1次
+: 至少1次;
{m}: 精确匹配m次
{m,n}:至少m次,至多n次
{m,}: 至少m次
{0,n}:至多n次
分组:()
引用:\1,\2,\3
扩展正则表达式与基本正则表达式相比增加了或者表示形式:a|b:a或者b
练习:用扩展正则表达式找出至少2个相邻o的行。
PHP?w=600&h=600&t=f&url=http://s3.51cto.com/wyfs02/M00/3C/B5/wKioL1PCP2HzFTOrAABSqe-_9Wo834.jpg">
fgrep'PATTERN'FILE...表示不支持正则表达式。