sed awk 第二版学习(二)—— 正则表达式语法

目录

一、表达式

二、成行的字符

1. 反斜杠

2. 通配符

3. 编写正则表达式

4. 字符类

(1)字符的范围

(2)排除字符类

(3)POSIX 字符类补充

5. 重复出现的字符

6. 匹配单词

7. gres 替换脚本

8. 限制范围


        在计算机术语中,表达式是某些需要被计算的东西。一个表达式描述一种结果。正则表达式描述了模式或特殊的字符序列,尽管没有必要指定一个精确的序列。例如:

^  *.*

        该表达式使用元字符(metacharacter)(也叫通配符)和空格,匹配一个具有一个或多个前导空格的行。

        grep、sed、awk 都使用正则表达式,但这三个程序并不能完全使用正则表达式语法中的所有元字符。为了理解正则表达式语法,必须了解由不同的元字符执行的功能。

一、表达式

        一个正则表达式描述了一种模式或字符序列。字符串连接是每个正则表达式的基本操作,也就是,一个模式匹配相邻的一系列字符。例如:

ABE

        每个字面字符都是一个正则表达式,它只匹配那个单独的字符。这个表达式描述了“B 跟着 A,E 跟着 B”,或者简单称为“字符串 ABE”。术语“字符串”意味着每个字符都与它前面的字符相连接。正则表达式区分大小写,因此“A”不匹配“a”。sed 和 awk 为使用正则表达式提供了不区分大小写的选项。

        接受正则表达式的程序必须首先解析正则表达式的语法来产生一个模式。然后逐行读取输入来尝试匹配该模式。输入行是一个字符串,要看字符串与模式是否匹配,程序将字符串的第一个字符与模式的第一个字符进行比较。如果匹配就比较第二个字符。无论何时只要匹配失败,就返回并从字符串中这个字符后面的字符重新开始匹配。下图说明了这个过程,在输入行上尝试匹配模式“abe”。


解释正则表达式

        正则表达式不只限于文字字符。例如元字符句点(.)可以作为“通配符”匹配任何单个字符。元字符星号(*)用于与它前面的正则表达式的零个、一个或多个匹配,该表达式通常是一个字符。星号元字符本身不匹配任何字符,它用于修饰它前面的内容。这与它在 shell 中的含义不同。正则表达式 .* 匹配任意数目的字符,而在 shell 中,* 本身就具有这种含义。* 作为一个 shell 元字符,表示“零或多个字符”。

        “.”和“*”代表了元字符的两个基本类型:能够被看做单个字符的元字符和被看做如何修饰前面的字符的元字符。使用元字符可以扩展或限制可能的匹配,从而更多地控制匹配什么和不匹配什么。

二、成行的字符

        表达式中的两个基本元素是:

  1. 以一个字面值或变量表示的值。
  2. 一个操作符。

        在正则表达式中,除下表中的元字符外,任意字符都被解释为只匹配它本身的字面值。

特殊字符

用途

.

匹配除换行符以外的任意单个字符。在 awk 中,句点也能匹配换行符。

*

匹配任意多个(包括零个)在它前面的单个字符,或由正则表达式指定的字符。

[...]

匹配方括号中的字符类中的任意一个。如果方括号中的第一个字符为脱字符(^),则表示否定匹配,即匹配除了换行符和类中列出的那些字符以为的所有字符。在 awk 中,也匹配换行符。连字符(-)用于表示字符类的范围。如果类中的第一个字符为右方括号(])则表示它是类的成员。所有其它的元字符在被指定为类中的成员时都会失去它们原来的含义。

^

如果作为正则表达式的第一个字符,则表示匹配行的开始。在 awk 中匹配字符串的开始,即使字符串包含嵌入的换行符。

$

如果作为正则表达式的最后一个字符,则表示匹配行的结尾。在 awk 中匹配字符串的结尾,即使字符串包含嵌入的换行符。

\{n,m\}

匹配它前面某个范围内单个字符,或由正则表达式指定的字符的出现次数。\{n\}匹配n次出现,\{n,\}至少匹配n次出现,\{n,m\}匹配n和m之间的任意次出现。

\

转义随后的特殊字符。

+

匹配前面的正则表达式的一次或多次出现。

?

匹配前面的正则表达式的零次或一次出现。

|

指定可以匹配其前面的或后面的正则表达式(替代)。

()

对正则表达式分组。

{n,m}

匹配它前面某个范围内单个字符,或由正则表达式指定的字符的出现次数。{n}匹配n次出现,{n,}至少匹配n次出现,{n,m}匹配n和m之间的任意次出现。(用于 POSIX 的 egrep 和 POSIX awk 而不是传统的 egrep 或 awk。)

元字符汇总

        元字符在正则表达式中有特殊的含义。下面介绍每个元字符的用法。

1. 反斜杠

        元字符反斜杠(\)将元字符转换成普通字符(或将普通字符转换成元字符)。它强制将任意元字符解释为普通字符,以便匹配该字符本身。

# 转义句点:
\.# 转义反斜杠:
\\# 将普通字符解释为元字符:
\(\) \{\} \n

2. 通配符

        句点(.)代表除换行符以外的任意字符的通配符(在 awk 中,句点甚至可以匹配嵌入式换行符),通常放在字面字符或其它元字符的前面或后面。

        匹配 Plymouth 后跟任意一个字符:

$ grep Plymouth. list 
John Daggett, 341 King Road, Plymouth MA

        本例中这个表达式与固定的字符串模式“Plymouth”具有相同的匹配:

$ grep Plymouth list
John Daggett, 341 King Road, Plymouth MA

        如果句点前的字符出现在行尾,因为句点不匹配换行符,所以不匹配那一行:

$ grep MA. list 
$ grep MA list 
John Daggett, 341 King Road, Plymouth MA
Eric Adams, 20 Post Road, Sudbury MA
Sal Carpenter, 73 6th Street, Boston MA

3. 编写正则表达式

        正则表达式允许编写简单或复杂的模式描述,而使编写正则表达式困难的因素是应用的复杂性:模式出现在各种不同的情况和上下文中。复杂性是语言本身所固有的。

        编写正则表达式的过程涉及 3 个步骤:

  1. 知道要匹配的内容以及它如何出现在文本中。
  2. 编写一个模式来描述要匹配的内容。
  3. 测试模式来查看它匹配的内容。

        这个过程实质上与程序员开发程序的过程相似。步骤 1 可以当做规范,它反映理解要解决的问题以及如何解决它。步骤 2 类似于编写程序代码,而步骤 3 相当于运行程序并根据规范测试它。步骤 2 和步骤 3 需重复进行,直到程序令人满意为止。

        对匹配描述进行测试可以确保这个描述和所期待的一样。仔细检查测试的结果,比较输出和输入,可以大大提高对正则表达式的理解。可以按下面的方式解析模式匹配的结果:

  • Hits(命中):要匹配的行。
  • Misses(未命中):不要匹配的行。
  • Omissions(遗漏):没有匹配但需要匹配的行。
  • False alarms(假报警):不要匹配但却匹配了的行。

4. 字符类

        可以列出要匹配的字符,使用方括号元字符([])将字符列表括起来,其中每个字符占据一个位置。这在处理大小写字符时很有用。例如:

[Ww]hat

        这个正则表达式可以匹配“what”或“What”。它匹配包含这 4 个字符的字符串的任意行。如果想提取包含 .H1、.H2、.H3 等结构化标题宏的行,可以使用下面的正则表达式:

\.H[12345]

        可以使用字符类在 UNIX 命令中指定文件名。例如为了从一组以章节为文件名的文件中提取标题可能输入:

$ grep '\.H[123]' ch0[12]

        注意必须用引号引住其中的模式,以便把它传递给 grep 而不是由 shell 解释。下面列出了方括号中具有特殊含义的字符。

  • \:转义任意特殊字符(只用于 awk 中)。
  • -:当它不在第一个或最后一个位置时,表示一个范围。
  • ^:仅当在第一个位置时表示反转匹配。

(1)字符的范围

        连字符(-)用于指定一个字符范围。每个字符类都匹配单个字符,如果指定多个类,可以描述多个连续的字符。

        匹配所有大写英文字母:

[A-Z]

        匹配数字:

[0-9]

        匹配数字、小写字母、问号、逗号、句点、分号、冒号、单引号或双引号:

[0-9a-z?,.;:'"]

        匹配“任意后面跟有句点、问号或感叹号的小写或大写字母”:

[a-zA-Z][.?!]

        如果闭括号(])是作为类中的第一个字符出现,那么它就被解释为类的一个成员。如果连字符在一个类中是第一个或最后一个字符,则失去其特殊含义。

        匹配算数操作符:

[-+*/]

        匹配 MM-DD-YY 或 MM/DD/YY 两种日期格式:

[0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]

(2)排除字符类

        类中作为第一个字符的脱字符(^)将类中的所有字符都排除在被匹配之外,或者说匹配除换行符(awk 中换行符也可以被匹配)以外的没有列在方括号中的任意字符。

        匹配任意非数字字符:

[^0-9]

        匹配非小写元音:

[^aeiou]

        匹配字符串“.DS”其后依次跟随一个空格、一个双引号、一个除了字符 1 以外的单个字符和一个双引号。

\.DS "[^1]"

(3)POSIX 字符类补充

        POSIX 标准定义了两类正则表达式:基本的正则表达式(BRE),grep 和 sed 使用;扩展的正则表达式,egrep 和 awk 使用。

        为了适应非英文环境,POSIX 标准增强了匹配不在英文字母表中的字符的字符类的功能。例如,法文 è 是一个字母字符,但使用典型的字符类 [a-z] 不匹配它。该标准提供了附加的字母序列,当匹配和排序字符串数据时,这些字符应该被作为单个单元看待。

        POSIX 还改变了常用的术语。“字符类”在 POSIX 标准中称为“括号表达式”。在括号表达式中,除字面字符外,还可以有如下标记:

  • 字符类。由 [: 和 :] 包围 的关键字组成的 POSIX 字符类。关键字描述了不同的字符类,例如文字字符、控制字符等等。
  • 排序符号。排序符号是多字符的序列,表示这些字符应该被看做是一个单元。它由 [. 和 .] 包围的字符组成。
  • 等价类。等价类列出了应该看做是等价的字符集。例如 e 和 è。它由地区化的字符元素(由 [= 和 =] 包围)组成。

        所有这三种结构都必须出现在括号表达式的方括号中。例如 [[:alpha:]!] 匹配任意单个字母字符或感叹号,[[.ch.]] 匹配整理元素 ch,但不只匹配字母 c 或字母 h。在法语地区中,[[=e=]] 可以匹配任意 e、è 或 é。下表列出了类及其匹配字符。

匹配字符

[:alnum:]

可打印字符,包括空白字符

[:alpha:]

字母字符

[:blank:]

空格和制表符

[:cntrl:]

控制字符

[:digit:]

数字字符

[:graph:]

可打印的和可见的非空格字符

[:lower:]

小写字符

[:print:]

可打印字符,包括空白字符

[:punct:]

标点符号字符

[:space:]

空白字符

[:upper:]

大写字符

[:xdigit:]

十六进制数

POSIX字符类

        GNU awk 和 GNU sed 支持字符类符号,但不支持另外两个括号符号。

5. 重复出现的字符

        星号(*)元字符表示它前面的正则表达式可以出现零次、一次或多次。可以使用星号元字符匹配出现在引号中的单词。

        不管单词 hypertext 是否出现在引号中都会被匹配。

"*hypertext"*

        看一系列数字:

1
5
10
50
100
500
1000
5000

        匹配所有行:

[15]0*

        匹配除前面两行以外的所有行:

[15]00*

        第一个 0 是字面值,第二个由星号修饰。常使用类似的方法匹配一个或多个(而不是零个或多个)空格:

  *

        当星号元字符前面有句点元字符时,表示匹配任意数目的字符。这可用于标识两个固定的字符串之间的字符的跨度。使用“.*”进行匹配的范围总是最大的(贪婪模式)。

        匹配引号中的任意字符串:

".*"

        匹配带有 <> 标记的所有行:

grep '<.*>' sample

        看下面的 5 行示例文本:

I can do it
I cannot do it
I can not do it
I can't do it
I cant do it

        匹配以上语句中的否定语句,但不匹配肯定语句:

can[ no']*t

        匹配所有行:

can.*t

        技术术语“closure(闭合)”有匹配“零次或多次”的能力。egrep 和 awk 使用的元字符扩展提供了几个非常有用的 closure 的变化。加号(+)匹配其前面正则表达式的一次或多次出现。问号(?)匹配零次或一次出现。不要和 shell 中的 ? 通配符混淆。shell 中的 ? 表示单个字符,等效于正则表达式中的“.”。

6. 匹配单词

        匹配 book,包括单数和复数:

$ cat bookwords 
This file tests for book in various places, such as
book at the beginning of a line or
at the end of a line book
as well as the plural books and
handbooks. Here are some
phrases that use the word in different ways:
"book of the year award"
to look for a line with the word "book"
A GREAT book!
A great book? No.
told them about (the books) until it
Here are the books that you requested
Yes, it is a good book for children
amazing that it was called a "harmful book" when
once you get to the end of the book, you can't believe
A well-written regular expression should
avoid matching unrelated words,
such as booky (is that a word?)
and bookish and
bookworm and so on.$ egrep "(^| )[\"[{(]*book[]})\"?\!.,;:'s]*( |$)" bookwords
This file tests for book in various places, such as
book at the beginning of a line or
at the end of a line book
as well as the plural books and
"book of the year award"
to look for a line with the word "book"
A GREAT book!
A great book? No.
told them about (the books) until it
Here are the books that you requested
Yes, it is a good book for children
amazing that it was called a "harmful book" when
once you get to the end of the book, you can't believe

        书中给出的正则表达式是“(^| )[\"[{(]*book[]})\"?\!.,;:'s]*( |$)”,很麻烦。试了一下,egrep 支持 \b,用这个很简单:

$ egrep '\bbook(s)?\b' bookwords

7. gres 替换脚本

$ cat gres 
if [ $# -lt "3" ]
then
echo Usage: gres pattern replacement file
exit 1
fi
pattern=$1
replacement=$2
if [ -f $3 ]
then
file=$3
else
echo $3 is not a file.
exit 1
fi
A="`echo | tr '\012' '\001' `"
sed -e "s$A$pattern$A$replacement$A" $file$ ./gres "A*Z" "00" test
All of us, including 00ippy, our dog
Some of us, including 00ippy, our dog

8. 限制范围

        匹配第一个引号里的内容:

$ cat sampleLine
.Se "Appendix" "Full Program Listings"$ ./gres '"[^"]*"' '00' sampleLine
.Se 00 "Full Program Listings"

        匹配两个数字之间至少有 5 个句点,并将句点替换为连字符:

$ cat sample
1........5
5........10
10.......20
100......200$ sed 's/\([0-9][0-9]*\)\.\{5,\}\([0-9][0-9]*\)/\1-\2/' sample
1-5
5-10
10-20
100-200

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/414638.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超越卷积滤波器,HyCoT利用Transformer捕捉高光谱图像的全局依赖性 !

近年来&#xff0c;基于学习的高光谱图像&#xff08;HSI&#xff09;压缩模型的开发引起了大量关注。现有的模型主要使用卷积滤波器&#xff0c;仅捕捉局部依赖性。 此外&#xff0c;它们通常会带来高昂的训练成本&#xff0c;并具有较大的计算复杂性。 为了解决这些问题&…

upload-labs通关攻略

Pass-1 这里上传php文件说不允许上传 然后咱们开启抓包将png文件改为php文件 放包回去成功上传 Pass-2 进来查看提示说对mime进行检查 抓包把这里改为image/jpg; 放包回去就上传成功了 Pass-3 这里上传php文件它说不允许上传这些后缀的文件 那咱们就可以改它的后缀名来绕过…

KinectFusion

1.KinectFusion 笔记来源&#xff1a; 论文地址&#xff1a;KinectFusion: Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera* 项目地址&#xff1a;github/KinectFusion [1] 截断符号距离 | TSDF, Truncated Signed Distance Function 本篇对Kinec…

工业储能柜内部运行状态监测装置

工商业储能是用户侧储能的主要应用之一&#xff0c;其核心场景包括峰谷套利、需&#xff08;容&#xff09;量管理、应急备电、动态增容和需求侧响应。为了实现这些功能并确保储能系统的安全、可靠与经济运行&#xff0c;储能集成厂家必须关注多个方面&#xff0c;其中储能设备…

WPF ToolkitMVVM IOC IServiceConllection

用微软自带的 IOC 需要安装 using Microsoft.Extensions.DependencyInjection; using System.Configuration; using System.Data; using System.Windows;namespace WpfApp3 {/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class…

BITCN合集(BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM)

BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM、BITCN-BILSTM、BITCN-SVM&#xff09; BITCN合集&#xff08;BITCN 、BITCN-GRU、BITCN-BIGRU、BITCN-LSTM等&#xff09;代码获取戳此处代码获取戳此处代码获取戳此处 BITCN&#xff08;双向时间卷积神经网…

uniapp引入最新版Animate.css及使用示例

亲测可用,不好用请移至评论区揍我 动画库官网:https://animate.style/ cdn地址:https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css(截至目前最新版为:v4.1.1) 1. 将css下载后导入项目static目录中 2. 重要!修改下载的css文件内容 文件内容如…

vue脚手架路由快速入门

这里写目录标题 路由 router路由插件的引用离线在线CDN 单独路由使用案例项目中如何定义路由1\安装路由2\创建路由文件router.js以及创建相关文件3\应用插件main.js4\实现切换<router-link></router-link>5\展示位置 <router-view></router-view> 嵌套…

在线绘制哑铃图(dumbbell chart)展示基因拷贝数变异(CNV)

导读&#xff1a; 哑铃图的名称来源于其形状&#xff0c;它看起来像一个哑铃&#xff0c;有两个圆形的“重量”在两端&#xff0c;通过一根“杆”连接。常用于展示两个或多个数据集之间的差异。本文介绍了如何使用哑铃图展示基因的拷贝数变异。 Journal of Translational Medi…

UDP简单聊天室创建

目录 一. 服务端模块实现 二. 处理聊天消息模块实现 三. 调用服务端模块实现 四. 客户端模块实现 五. 效果展示 本文介绍了如何用UDP创建一个简单的聊天室。 一. 服务端模块实现 服务端仍然沿用我们前面的思想&#xff08;高内聚低耦合&#xff09;&#xf…

C语言小tip之函数递归

hello&#xff0c;各位小伙伴们今天我们来学习一下函数递归。 什么是函数递归呢&#xff1f;简单来说就是函数自己来调用自己。函数递归的主要思想是把大事化小&#xff0c;递归包含两层方面&#xff1a;1、递推 2、回归 在使用函数递归的时候要注意包含两个限制条件&#…

Linux 软硬连接

1. 硬链接 实际上并不是通过文件名来找到磁盘上的文件&#xff0c;而是通过inode。在linux中可以让多个文件名对应于同一个 inode&#xff0c;而这种方式就是建立硬链接。硬链接是文件系统中的一种链接类型&#xff0c;它创建了文件的一个额外的目录项&#xff0c;但不占用额外…

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用

SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&#xff0c;使其能够精确的模拟土壤中水分的运动&#xff0c;而且耦合了W…

EmguCV学习笔记 C# 7.1 角点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Ubuntu22.04安装 docker和docker-compose环境

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;它使开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;…

蓝色炫酷碎粒子HTML5导航源码

源码介绍 蓝色炫酷碎粒子HTML5导航源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果预览 源码获取 蓝色炫酷碎粒…

Halcon提取边缘线段lines_gauss 算子

Halcon提取边缘线段lines_gauss 算子 edges_color_sub_pix和edges_sub_pix两个算子使用边缘滤波器进行边缘检测。还有一个常用的算子lines_gauss算子&#xff0c;也可以用于提取边缘线段&#xff0c;它的鲁棒性非常好&#xff0c;提取出的线段类型是亚像素精度的XLD轮廓。其原…

LLM训练、精调与加速:大型语言模型的高效开发与应用策略

创作不易&#xff0c;您的关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 大家有技术交流指导、论文及技术文档写作指导、项目开发合作的需求可以私信联系我 LLM&#xff08;大型语言模型&#xff09;的训练、精调和加速是当前人工智能研究和应用中的重要话题。下面将…

JVM垃圾判定算法

垃圾收集技术是Java的一堵高墙。Java堆内存中存放着几乎所有的对象实例&#xff0c;垃圾收集器在对堆内存进行回收前&#xff0c;第一件事情就是要确定这些对象中哪些还存活&#xff0c;哪些已经死去&#xff08;即不可能再被任何途径使用的对象&#xff09;。也就是判定垃圾。…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(五)- 3GPP Release19 研究计划

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…