详解 linux 正则表达式(以grep为例)

参考资料:《鸟哥的linux私房菜—基础篇》

1 什么是正则表达式?


**正则表达式(Regular Expression ,RE)**是透过一些特殊字符的排列,用以 [搜寻/取代/删除] 一列或多列文字字符串,简单地说,正则表达式就是用在字符串处理上面的一项 [表达式]
用途:利用正则表达式的功能将重要信息摘取出来,便于查阅。

说明:正则表达式基本上是一种 [表示法],只要工具程序支持,那么该工具程序就可以用来作为正则表达式的字符串处理之用。例如 vi grep awk sed 支持正则表达式,cp ls等指令不支持,只能使用bash自身的通配符

2 基础正则表达式


2.1 语系对正则表达式的影响

例如,在英文大小写的编码顺序中,zh_TW.big5及C这两种语系的输出结果分别如下:

  • LANG=C : 0 1 2 3 4 … A B C D…Z a b c d … z
  • LANG=zh_TW.big5 : 0 1 2 3 4 … a A b B c C …z Z

【注】:底下的练习都是使用 LANG =C来进行
为了避免这样编码所造成的英文与数字的摘取问题,需要了解一些特殊符号:
详解 linux 正则表达式(以grep为例)

2.2 使用grep

详解 linux 正则表达式(以grep为例)
详解 linux 正则表达式(以grep为例)
详解 linux 正则表达式(以grep为例)
注:grep在数据中查询一个字符串时,是以 ** ”整行“为单位 ** 来进行数据的撷取的。

2.3 基础正规表示法练习

我们处理的文件以书中提供的这个txt为例
http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt

搜寻特定字符串
详解 linux 正则表达式(以grep为例)
反向选择
详解 linux 正则表达式(以grep为例)
搜索特定字符串(不区分大小写)
详解 linux 正则表达式(以grep为例)
利用中括号[]搜寻集合字符
详解 linux 正则表达式(以grep为例)
[]里面不论有几个字符,它都代表某一个字符
想要搜索包含oo的字符
详解 linux 正则表达式(以grep为例)
不想要oo前面有g
详解 linux 正则表达式(以grep为例)
假设oo前不想有小写字符
详解 linux 正则表达式(以grep为例)
要求字符串是数字
详解 linux 正则表达式(以grep为例)
详解 linux 正则表达式(以grep为例)
考虑到语系对于编码的影响,上述两个例子也可以这样:
详解 linux 正则表达式(以grep为例)
查询只在行首列出的the
详解 linux 正则表达式(以grep为例)
想要开头是小写字符的那一行
详解 linux 正则表达式(以grep为例)
也可以这样:
详解 linux 正则表达式(以grep为例)
不想开头是英文字母
详解 linux 正则表达式(以grep为例)

注意: ^ 符号,在[ ]内表示反向选择,在[]之外则表示定位在行首

想要行尾为小数点(.)的那行
详解 linux 正则表达式(以grep为例)
找出空白行
详解 linux 正则表达式(以grep为例)
详解 linux 正则表达式(以grep为例)

正则表达式中:

  • ’ . ‘ 代表 一定有一个任意字符的意思
  • ‘ * ’ 代表 重复前一个字符,0到无穷多次的意思,为组合形态

找出包含两个o以上的字符串
详解 linux 正则表达式(以grep为例)
找到 g…g形式的字符串
详解 linux 正则表达式(以grep为例)

在这里,‘ .* ’代表零个或多个任意字符的意思

限定连续RE字符串范围 { }
因为{ }在shell里是有特殊意义的,因此。要使用‘\’
找到两个o的字符串
详解 linux 正则表达式(以grep为例)
2~5个o
详解 linux 正则表达式(以grep为例)

2.4 基础正则表达式字符汇总

详解 linux 正则表达式(以grep为例)
详解 linux 正则表达式(以grep为例)
详解 linux 正则表达式(以grep为例)

3 延申正则表达式

这里不做详细示例,有兴趣可以搜集资料
详解 linux 正则表达式(以grep为例)
详解 linux 正则表达式(以grep为例)