我是靠谱客的博主 紧张海燕,最近开发中收集的这篇文章主要介绍linux 正则表达式详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

    • 声明
    • 基础正则表达式
      • 基础正则表达式语法
      • 样例详解
        • 查找特定字符串
        • 使用list规则来进行查找
        • 对行首和行尾字符进行限定
        • 任意一个字符与重复字符
        • 限定连续字符范围
    • 拓展正则表达式
      • 扩展正则表达式语法
      • 样例详解
        • 重复一个或一个以上的前一个RE字符
        • 零个或者一个前一个RE字符
        • 查找组
        • 多个重复组判断
    • 强调

声明

以下内容均总结自鸟哥私房菜这本书,如想详细了解,请参考该书以及其它相关资料。学习下面基础正则表达式之前请先简单了解一下grep的用法。

基础正则表达式

基础正则表达式语法

RE字符含义
^word待搜寻的字符串(word)在行首!
word$待搜寻的字符串(word)在行尾!
.代表『任意一个』字符,一定是一个任意字符!
转义字符,将特殊符号的特殊意义去除
*代表『任意一个』字符,一定是一个任意字符!
[list]找出包含在list集合里面的字符
[n1-n2]找出包含在n1-n2范围内的字符,这个是[list]的一种特殊写法,要求n1-n2使有序的,比如a-z表示小写字母,A-Z表示大写字母,0-9表示数字0到9,连续与否与ASCII哟有关
{n,m}这是限定连续RE字符的范围,{n,m}表示连续前一个字符的个数在n到m之间,若为{n}则表示连续n个前一个字符,若为{n,}则表示连续n个以上前一个字符
[^list]匹配不在list集合里面的字符

仅看上面的规则可能不能完全看懂,下面结合实际的例子来讲解,在讲解之前请先执行下面指令将文本样例下载下来。

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

样例详解

1.查找特定字符串

查找包含the的行

[root@localhost tmp]# grep -n 'the' regular_express.txt

查找不包含the的行

[root@localhost tmp]# grep -nv 'the' regular_express.txt

不区分大小写

[root@localhost tmp]# grep -in 'the' regular_express.txt

查找包含Tast或者test字符串的行

2.使用[list]规则来进行查找

查找包含taste或test字符串的行

[root@localhost tmp]# grep -n 't[ae]st' regular_express.txt

注意这里面正则表达式t[ae]st只能表示两个值tast或test,不能表示taest,也就是[]里面的字符串只选一个进行结合。

查找包含oo的行

[root@localhost tmp]# grep -n 'oo' regular_express.txt 

查找oo前面的字符不是g的行

[root@localhost tmp]# grep -n '[^g]oo' regular_express.txt

查找oo前面不是小写字母开始的行

[root@localhost tmp]# grep -n '[^a-z]oo' regular_express.txt

这里面的-符号是有特使含义的,表示连续一组字符,字符是否连续和ASCII有关,这是一种简写,你也可以在[]里把a到z的所有字符全部写出来,明显没有[a-z]简单。同样的[0-9],[A-Z]也是简写。

3.对行首和行尾字符进行限定^$

行首以字符串the开头

[root@localhost tmp]# grep -n '^the' regular_express.txt

行首以小写字母开头

[root@localhost tmp]# grep -n '^[a-z]' regular_express.txt

行首不是英文字母开头

[root@localhost tmp]# grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:# I am VBird

这里要注意了,^这个符号在[]里面和外面是完全不一样的,在外面表示定位在行首,起到定位的作用,在里面表示非的意思。

查找以.结尾的行

[root@localhost tmp]# grep -n '.$' regular_express.txt

使用$定位在行尾,想要以.结尾的,但是.有特殊意义,所以需要使用来转义吗,
来解除其特殊含义。在linux中每行是以$来结尾的,那么如何匹配空白行呢?

[root@localhost tmp]# grep -n '^$' regular_express.txt 
22:

所以如果想过滤文件中空白行和注释行,可以使用下面的指令

[root@localhost tmp]# grep -v '^$' /etc/sysconfig/iptables-config | grep -v '^#'

grep -v ‘^$’表示过滤空白行,grep -v ‘^#’表示过滤注释行。

4.任意一个字符.与重复字符*

. 代表一定有一个任意字符
* 代表重复前一个0到无穷多次的意思
找出g??d的字符,即g开头,d结尾的四个字符

[root@localhost tmp]# grep -n 'g..d' regular_express.txt 

如果想要列出含有oo,ooo,oooo等的数据,也就是至少含有两个o以上。用o*合适吗?不合适。因为表示前面字符重复0到任意多次,所以可以是空,啥都没有,所以o会匹配出所有数据。应该使用oo*,即至少有一个o,同理至少两个o为oo*。

[root@localhost tmp]# grep -n 'oo*' regular_express.txt

匹配字符开头和结尾都是g,中间必须是o且可以有多个,即gog,goog,gooog等

[root@localhost tmp]# grep -n 'goo*g' regular_express.txt

找到g开头和g结尾的

[root@localhost tmp]# grep -n 'g.*g' regular_express.txt

包含任意数字

[root@localhost tmp]# grep -n '[0-9][0-9]*' regular_express.txt

5.限定连续字符范围{}

由于{}在shell中是有特殊含义的,所以使用时需要先转义
限定字符中只包含两个o

[root@localhost tmp]# grep -n 'o{2}' regular_express.txt

gg中间包含2到5个o

[root@localhost tmp]# grep -n 'o{2,5}' regular_express.txt

gg中间至少包含两个o,这个又两种写法

[root@localhost tmp]# grep -n 'gooo*g' regular_express.txt
[root@localhost tmp]# grep -n 'go{2,}g' regular_express.txt

注意:”!”在正则表达式中并不是特殊字符,所以要想查找文件中含有!和>字符的行,可以这样。

[root@localhost tmp]# grep -n '[!>]' regular_express.txt

强调一下,正则表达式和linux的通配符是不一样的,在通配符中*代表零到无限多个字符,比如我使用

[root@localhost tmp]# ls test*
test.patch

拓展正则表达式

了解基础正则表达式已经足够了,但是有些时候为了简化操作,也需要使用扩展正则表达式。比如使用基础正则表达式去除空白行和行首是#开头的注释行,使用

[root@localhost tmp]# grep -v '^$' regular_express.txt | grep -v '^#'

如果使用扩展正则表达式可以使用

[root@localhost tmp]# egrep -v '^$|^#' regular_express.txt

使用扩展表达式时,使用egrep而不是grep。

扩展正则表达式语法

RE字符含义
+重复一个或一个以上的前一个RE字符
零个或者一个前一个RE字符
|表示或
()查找组字符串
()+多个重复组判断

样例详解

1. +:重复一个或一个以上的前一个RE字符

找出包含god,good,goood的行

[root@localhost tmp]# egrep -n 'go+d' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.
13:Oh!
My god!

2. ?:零个或者一个前一个RE字符

找出包含gd或god的行

[root@localhost tmp]# egrep -n 'go?d' regular_express.txt
13:Oh!
My god!
14:The gd software is a library for drafting programs.

3. |:或

找出包含god,good,或者dog的行

[root@localhost tmp]# egrep 'god|good|dog' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.
Oh! My god!
I like dog.

4. ():查找组

找出包含glad或者good的行

[root@localhost tmp]# egrep 'g(oo|la)d' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.
The world <Happy> is the same with "glad".

5. ()+:多个重复组判断

在下面的文本内容中,找出以A开头C结尾的含有一个以上的xyz字符串。
文本内容:
1.sasbAxyzxyzxyzCqwee
2.sdafAxysaC

[root@localhost tmp]# echo '1.sasbAxyzxyzxyzCqwee
2.sdafAxysaC' | egrep 'A(xyz)+C'
1.sasbAxyzxyzxyzCqwee

强调

ls test*表示查找文件名test开头的文件。而在正则表达式中*则代表重复前面的RE字符0到无穷多次,通配符和正则不要搞混了。

最后

以上就是紧张海燕为你收集整理的linux 正则表达式详解的全部内容,希望文章能够帮你解决linux 正则表达式详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部