详解 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来进行
为了避免这样编码所造成的英文与数字的摘取问题,需要了解一些特殊符号:
2.2 使用grep
注:grep在数据中查询一个字符串时,是以 ** ”整行“为单位 ** 来进行数据的撷取的。
2.3 基础正规表示法练习
我们处理的文件以书中提供的这个txt为例
http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt
搜寻特定字符串
反向选择
搜索特定字符串(不区分大小写)
利用中括号[]搜寻集合字符
[]里面不论有几个字符,它都代表某一个字符
想要搜索包含oo的字符
不想要oo前面有g
假设oo前不想有小写字符
要求字符串是数字
考虑到语系对于编码的影响,上述两个例子也可以这样:
查询只在行首列出的the
想要开头是小写字符的那一行
也可以这样:
不想开头是英文字母
注意: ^ 符号,在[ ]内表示反向选择,在[]之外则表示定位在行首
想要行尾为小数点(.)的那行
找出空白行
正则表达式中:
- ’ . ‘ 代表 一定有一个任意字符的意思
- ‘ * ’ 代表 重复前一个字符,0到无穷多次的意思,为组合形态
找出包含两个o以上的字符串
找到 g…g形式的字符串
在这里,‘ .* ’代表零个或多个任意字符的意思
限定连续RE字符串范围 { }
因为{ }在shell里是有特殊意义的,因此。要使用‘\’
找到两个o的字符串
2~5个o
2.4 基础正则表达式字符汇总
3 延申正则表达式
这里不做详细示例,有兴趣可以搜集资料