正则表达式基础

Linux Shell以字符串作为表达式向系统传达意思。元字符(Metacharacters)是用来阐述字符表达式意义的字符,是描述字符的字符,它用于对字符表达式的内容、转换及各种操作信息进行描述。正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)。正则表达式的主要功能是文本查询和字符串操作,它可以匹配文本的一个字符或字符集合。

POSIX标准将正则表达式分为两类:基本的正则表达式和扩展的正则表达式,大部分Linux应用和工具仅支持基本的正则表达式。基本的正则表达式元字符集合及其意义如下:

符号 意义
* 0个或多个在*字符之前的那个普通字符
. 匹配任意一个字符
^ 匹配行首,或后面字符的非
$ 匹配行尾
[] 匹配[]内字符集合里的一个字符
\ 转义字符,屏蔽一个元字符的特殊意义
<\> 精确匹配符号
\{n\} 匹配前面字符出现n次
\{n,\} 匹配前面字符至少出现n次
\{n,m\} 匹配前面字符出现n~m次

1. *符号

*符号用于匹配前面一个普通字符的0次或多次重复。例如hel*o匹配helo、hello、helllo等。

2. .符号

.符号用于匹配任意一个字符。例如,...73.表示前三个字符为任意字符,第4个字符是'7',第5个字符是'3',最后一个字符为任意字符,如xcb738、4J973U都能匹配。需要注意,.符号可以匹配空格。因此x b738ui 73e也能匹配。

3. ^符号

^符号用于匹配行首。行首的第一个字符是^后面那个字符。例如,^cloud表示匹配以cloud开头的行。再举一个例子,^...X86*表示行首的前三个字符为任意字符(可以是空格),第4~6个字符为X86,第7个字符开始可以重复匹配6,866X866668 6X86等都可以匹配。

4. $符号

$符号匹配行尾,,与^符号的功能和用法都相反。例如micky$表示匹配以micky结尾的行。一个特殊的正则表达式是匹配空行。如下所示:

^$

该正则表达式既匹配行首,又匹配行尾,中间没有任何字符,所以匹配空行。很多命令都用到这个正则表达式来匹配空行。

5. []符号

[]符号匹配字符集合,该符号支持穷举方法列出字符集合的所有元素,也支持使用-表示字符集合范围。字符集合范围从-左边字符开始,到-右边字符结束。下面举例说明[]用法:

#匹配任意一个数字
[0123456789] #直接穷举
[0-9] #用范围表示,比较简洁 #匹配字母
[a-z] #所有小写字母
[A-Z] #所有大写字母
[b-p] #小写字母b到p
[a-zA-Z] #匹配一个小写字母或大写字母
[a-zA-Z]* #匹配任意个小写字母或大写字母

我们已经知道,^符号表示匹配行首,但当^符号放到[]符号中就不再表示匹配行首,而是取反符号。例如,[^b-d]表示匹配不在bd范围之内的字符。此时,`^`符号不在表示匹配行首,而是取反符号,不在bd范围内的字符涵盖了除了小写字母b、c和d之外的所有字符(包括其他字母、数字、空格等)。

6. \符号

\符号是转义字符,用于屏蔽一个元字符的特殊含义,即以字面意义来解释\符号后面的字符。例如,\.表示匹配字符.

7. \<\>符号

\<\>符号是精确匹配符号,该符号利用\符号屏蔽<>符号的特殊意义。例如,\<the\>表示精确匹配the,而不匹配包含the的字符串,如themthereanother等。

8. \{\}符号

\{\}符号与*符号很类似,都表示前一个字符的重复。不同的是,*符号表示重复0次或多次,而\{\}符号可以指定重复次数。示例如下:

jo\{3\}b                #重复字符o 3次,匹配jooob
jo\{3,\}b #重复字符o 至少3次,匹配jooob、joooob、jooooob等
jo\{3,6\}b #重复字符o 3~6次,匹配jooob、joooob、jooooob\joooooob
[a-z]\{5\} #表示匹配五个小写字母

正则表达式的扩展

除了基本的正则表达式之外,awk和perl等Linux工具还支持正则表达式扩展出来的一些元字符。扩展的正则表达式元字符及其意义如下:

符号 意义
? 匹配0个或1个在它前面的一个字符
+ 匹配1个或多个在它前面的一个字符
() 表示一个字符集合或或用在表达式中
| 表示“或”,匹配一组可选的字符

示例如下:

jo?b                #匹配job、joob
S+EU #匹配SSEU、SSSEU、SSSSEU等,但不能匹配SEU

()符号通常与|符号结合使用,表示一组可选字符的集合。例如re(a|e|o)d中的(a|e|o)表示在a、e和o中选择一个字符进行匹配,因此re(a|e|o)d匹配read、reed、reod。事实上,()符号很少被用到,因为[]符号能够替代()符号表示一组可选字符的集合,re(a|e|o)d就等价于re[aeo]d

|符号也可以表示多个正则表达式的“或”关系,格式如下:

RE1 | RE2 | RE3 | ...           #RE1、RE2、RE3表示正则表达式

|符号在扩展的正则表达式中表示“或”的这种用法很少有人记得,|符号最著名的用法是作为管道符号。

通配

bash Shell本身并不支持正则表达式,支持正则表达式的是一些命令和工具,如grep、sed、awk等,但是bash Shell支持通配(Globbing)功能,通配是把一个包含通配符的非具体文件名扩展到存储在计算机、服务器或者网络上的一批具体文件名的过程。掌握通配符的使用有助于简化一些问题的处理步骤。Shell常见通配符如下:

字符 含义
* 匹配任意多个字符
? 匹配一个字符
[] 匹配[]内字符集合里的一个字符
^ 匹配结果取反,与[]配合使用
{} 匹配括号内包含的一个或多个字符串

示例如下:

*.awk                   #匹配以.awk结尾的文件
0?.pem #匹配以0开头、后面有一个字符且以.pem结尾的文件
[a-h]*.awk #匹配以a~h范围内的字母开头,并以.awk结尾的文件
[^a-h]* #匹配不以a~h范围内字母开头的文件
{0?.pem,[a-h]*.awk} #匹配以0开头、后面有一个字符且以.pem结尾的文件或者以a~h范围内的字母开头,并以.awk结尾的文件

grep命令

grep是Globally search Regular Expression and Print out the line的简称,即全面搜索正则表达式,并把行打印出来。grep是一种强大的文本搜索工具,它使用正则表达式搜索文本,并把匹配的行打印出来。grep命令格式如下:

grep [选项] [模式] [文件...]

常用grep命令选项及其意义如下:

选项 意义
-c 只输出匹配行的数量(默认情况下,grep命令打印出匹配模式的所有行)
-i 搜索时忽略大小写(默认情况下,区分大小写)
-h 查询多文件时不显示文件名(默认情况下,grep命令搜索多个文件时,在匹配行之前显示文件名)
-l 只列出符合匹配的文件名,而不列出具体的匹配行
-n 列出匹配行,并显示行号(默认情况下,grep命令搜索单个文件时,只显示匹配行的内容;搜索多个文件时,显示文件名和匹配行的内容。加上-n选项后,将在行内容前显示行号)
-s 不显示文件不存在或无匹配文本的错误信息(默认情况下,grep命令在待搜索文件不存在或搜索不到匹配模式的文本行时打印错误信息)
-v 显示不匹配模式的所有行(相当于取反)
-m num 匹配num次后停止
-w 匹配整词
-x 匹配整行
-r 递归搜索,不仅搜索当前目录,而且搜索子目录(默认情况下,grep命令只对当前目录下的文件进行搜索)
-q 不输出任何结果,以退出状态表示是否搜索成功。退出状态0表示搜索成功,退出状态1表示未搜索到满足模式的匹配行,退出状态2表示命令或程序由于错误未能执行
-b 输出匹配行距文件头部的偏移量,以字节为单位
-o 与-b选项结合使用,输出匹配的词距文件头部的偏移量,以字节为单位
-E 支持扩展的正则表达式(grep -E相当于egrep)
-F 不支持正则表达式,按字符串字面意思进行匹配(grep -F相当于fgrep)

两个讲解grep命令例子如下:

现在我们回顾一下find命令:

  • 功能:在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大。
  • 语法:find 起始目录 寻找条件 操作
  • 说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对之采取相关的操作。

所以grep和find的区别简单来讲,grep是查找匹配条件的行,find是搜索匹配条件的文件。

为了保持不同国家的字符编码的一致性,POSIX(Portable Operating System Interface of UNIX)增加了POSIX字符类。grep命令支持POSIX字符类。常见POSIX字符类如下:

类名 意义
[:upper:] 大写字母[A-Z]
[:lower:] 小写字母[a-z]
[:digit:] 阿拉伯数字[0-9]
[:alpha:] 大小写字母[A-Za-z]
[:alnum:] 大小写字母和阿拉伯数字[A-Za-z0-9]
[:space:] 空格或Tab键
[:cntrl:] Ctrl键
[:graph:]或[:print:] ASCII码在33~126之间的字符
[:xdigit:] 十六进制数字[0-9A-Fa-f]

Linux Shell编程第3章——正则表达式的更多相关文章

  1. Linux Shell编程第5章——文件的排序、合并和分割

    目录 sort命令 sort命令的基本用法 uniq命令 join命令 cut命令 paste命令 split命令 tr命令 tar命令 sort命令 sort命令是Linux系统一种排序工具,它将输 ...

  2. Linux Shell编程第4章——sed和awk

    目录 sed命令基本用法 sed命令实例 命令选项 文本定位 编辑命令 awk编程模型 awk编程实例 1.awk模式匹配 2.记录和域 3.关系和布尔运算符 4.表达式 5.系统变量 6.格式化输出 ...

  3. Linux Shell编程第2章——Linux文件系统

    目录 用户和用户组管理 用户管理常用命令 用户组管理常用命令 文件和目录操作 文件操作常用命令 目录操作常用命令 文件和目录权限管理 文件查找--find 用户和用户组管理 用户管理常用命令 用户的角 ...

  4. Linux Shell编程第1章——Shell脚本编程概述

    目录 Linux和Shell简介 Linux是一套可免费使用和自由传播的类UNIX操作系统.Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送 ...

  5. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  6. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  7. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  8. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

  9. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

随机推荐

  1. 拖拽 支持ie6

    可随意拖拽方块至任一位置: 1.setCapture方法:多用于容器对象,效果是对指定的对象设置鼠标捕获.使在容器内的子对象的鼠标事件均由容器对象触发,因此,只能在容器对象的鼠标事件函数中进行处理.当 ...

  2. 如何用redis/memcache做Mysql缓存层

    方法一:直接用MysqlMysql有缓存,实现了类似的功能,如果需要缓存的东西很多,可以把缓存的内存设置大一点.这样的好处就是不用去控制缓存的失效,确保数据一致性. 方法二:启用用DAO框架的缓存比如 ...

  3. poj 2503 Babelfish(字典树或着STL)

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 35828   Accepted: 15320 Descr ...

  4. 使用Using的注意事项

    参数传递 C#中有四种参数类型:值类型,Ref参数,Out参数,params参数.默认参数都是以传值方式传递,这意味着方法中的变量会在内存中被分配新的存储空间,并赋值.对于引用类型,这种传值意味着传递 ...

  5. 提高php编程效率的小结

    1.如果将类的方法定义为:static,它的执行效率将提升为近4倍 2.php中数组的元素调用,使用关联数组优于索引数组 3.使用each快于print. 4.尽量使用foreach()替代for() ...

  6. 【ARDUINO】蓝牙(HC-05)透传

    1.蓝牙连接ARDUINO 工作模式:VCC-5.5V GND-GND TXD-RX RXD-TX  工作模式下默认波特率38400 AT模式,在工作模式的基础上KEY-VCC/5.5V 设置从模式: ...

  7. Django admin 的 9 个技巧

    Tip 1:Django admin 后台不限于用 Django 开发的网站 虽然 Django admin 管理界面可以非常友好的用在 Django 项目的其它部分,它同样可以很容易用于其它像传统的 ...

  8. javascript 上传文件相关 (5) Blob 对象

    这一系列文章都讲述的是关于使用 JavaScript 操作文件相关的知识,其中最重要的是 File 对象,而实际上 file 对象只是 blob 对象的一个更具体的版本,blob 存储着大量的二进制数 ...

  9. java如何遍历当月所有的日期?

    转自:https://zhidao.baidu.com/question/360215274.html import java.util.ArrayList;import java.util.Cale ...

  10. Elasticsearch集群 管理

    第7章 深入Elasticsearch集群 启动一个Elasticsearch节点时,该节点会开始寻找具有相同集群名字并且可见的主节点.如 果找到主节点,该节点加入一个已经组成了的集群:如果没有找到, ...