正则表达式基础

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. 大数据(8) - hive的安装与使用

    什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能. 本质是: ...

  2. JDK7 Garbage Frist

    JDK7 G1新型垃圾回收器. http://www.infoq.com/cn/articles/jdk7-garbage-first-collector

  3. Unity3D和网页数据交互的基本原理

    简介: 1.Unity3D的游戏引擎是和编辑器集成在一起的,所有它也是一个制作/开发平台. 2.Unity3D是使用JavaScript.C#作为核心脚本语言来驱动事个游戏引擎. 3.平台可以发布Ex ...

  4. .NET学习笔记(1)

    把 DataSet 绑定到 Repeater 控件 Repeater 控件用于显示重复的项目列表,这些项目被限制在该控件.Repeater 控件可被绑定到数据库表.XML 文件或者其他项目列表. 获取 ...

  5. ISP图像调试工程师

    汉邦高科 任职要求: 1. 电子工程.图像与信号处理.计算机等相关专业,本科及以上学历: 2. 在数字图像处理.视频压缩等方面具有扎实的理论背景知识: 3. 熟悉Sony.Panasonic.Apti ...

  6. XMLHttpRequest的withCredentials属性

    最近对接第三方网站出现一下错误:Access to XMLHttpRequest at 'https://third.site.com/request_url' from origin 'https: ...

  7. ARM汇编语言(1)(基本概念)

    1.***.s文件为汇编语言文件格式: 2.ARM寄存器(以Samsung芯片为例) 2.1.要介绍arm寄存器之前我们要先了解一下arm处理器的工作模式: Arm处理器有七种工作模式,为的是形成不同 ...

  8. Python中xlrd和xlwt模块使用方法 (python对excel文件的操作)

    本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...

  9. 【LeetCode】Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

  10. 第四篇:“ 不确定 "限制值的使用

    前言 前篇文章解释了限制值的五种类型以及获取它们的方法.但是对于其中可能不确定的类型( 45类型 ),当限制值获取函数返回-1的时候,我们无法仅通过这个函数返回值-1来判断是限制值获取失败还是限制值是 ...