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

news2024/9/23 5:23:56

目录

一、表达式

二、成行的字符

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.coloradmin.cn/o/2097095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP动物收容所管理系统-计算机毕业设计源码94164

摘 要 利用PHP语言和相关技术&#xff0c;设计和实现一个高效、可靠的动物收容所管理系统。该系统将提供系统用户、动物信息管理、领养申请处理、志愿者管理、医疗记录管理、捐赠信息、系统管理等功能&#xff0c;旨在促进动物收容所管理工作的便捷和透明化。本研究首先介绍了动…

HyperMesh教程从入门到精通:HyperMesh模型管理

1.4 模型管理 在HyperMesh中创建一个有效的求解输入文件时&#xff0c;模型管理功能是非常必要的。本节将介绍基本的模型管理方法&#xff0c;如单元和载荷归类、集合组装、重命名、删除、排序以及重新编号等。 本节将学习如何&#xff1a; 创建几何和组件归类。单元归类。组…

windows任务栏的空白清除

windows任务栏的空白出现一块一块的空白&#xff0c;看着好难受&#xff0c;下面介绍下怎么进行清除 在Windows操作系统中&#xff0c;任务栏出现空白区域可能是由多种原因引起的&#xff0c;比如图标被意外删除或隐藏、系统更新后的兼容性问题、或是某些程序错误地修改了系统设…

Java基于微信小程序的美食推荐小程序,附源码

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

全域运营哪家公司好?为什么很多人都选了它?

随着本地生活下半场的到来&#xff0c;以全域运营服务商为代表的新兴职业的未来前景和收益空间不断显现&#xff0c;使得越来越多的人有了加入全域运营服务商赛道的想法。不少创业者因此得到了新的启发&#xff0c;即通过搭建全域运营系统为全域运营服务商提供作业平台等各项服…

【Windows】windows server如何实现 ps aux | grep xxx 方式过滤出要看到的进程信息

在Windows Server中&#xff0c;可以使用PowerShell或命令提示符&#xff08;cmd.exe&#xff09;来实现类似Linux中ps aux | grep xxx的功能。具体来说&#xff0c;可以使用PowerShell的Get-Process命令来获取进程信息&#xff0c;并使用管道&#xff08;|&#xff09;和筛选命…

springboot学习11 (菜品缓存redis)

缓存逻辑分析 目的&#xff1a;减轻数据库压力每个分类下的菜品保存一份缓存数据数据库中菜品数据有变更时清理缓存数据 keyvaluedish_1string(...)dish_2string(...)dish_3string(...) GetMapping("/list")ApiOperation("根据分类id查询菜品")public Res…

C++国密SM2算法加解密的使用

目录 效果 在线校验 代码实现参考 项目 下载 效果 加密字符串:lxw 123abcD 2024-09-01:12:00加密后信息:042E82EE8ACE2BD56FA71DC6A0C34190627AA365F8EEE6261903BEE327A85EB5E1D6E78F2D79AD6F6DC9E45C0829625DC3165BB78BD897F99044A640F930653747939CF9D5A10C8216F945A559…

【Python】标准库的使用

文章目录 标准库日期计算字符串操作剑指offer 58&#xff0c;翻转单词顺序思路 leetcode 796&#xff0c;旋转字符串思路 leetcode 2255&#xff0c;统计是给定字符串前缀的字符串数目思路 文件查找工具 Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效…

一文带你玩转美国头条NewsBreak平台广告开户优势

一文带你玩转美国头条NewsBreak平台广告开户优势 一、NewsBreak是什么&#xff1a;美国资讯APP的璀璨新星 NewsBreak平台&#xff0c;一款在美国本土迅速崛起的资讯APP&#xff0c;以其1600万的日活跃用户和4000万的新闻订阅用户&#xff0c;成为众多出海企业关注的焦点。它不…

vue-virtual-scroller插件实现不等高表格虚拟滚动

对于大量的表格数据加载&#xff0c;如果我们全部加载不仅面临加载等待时间长&#xff0c;容易崩溃的问题&#xff0c;还有可能导致浏览器缓存数据量大而导致页面使用卡顿的情况。 所以我们使用虚拟滚动加载来优化这种情况&#xff0c;在这里我们使用插件vue-virtual-scroller来…

【Windows】windows powershell 如何实现tail -f xx.log 实时看日志的功能?

windows powershell 如何实现tail -f xx.log 实时看日志的功能&#xff1f; 在Windows PowerShell中&#xff0c;要实现类似于Linux中的tail -f xx.log实时查看日志文件的功能&#xff0c;可以使用Get-Content命令配合-Tail和-Wait参数。这将让你能够实时地查看日志文件的变化。…

前端面试资料集合

整理了前端面试相关资料&#xff0c;包含课程(5们)、面试题(道)、面试书籍(本)&#xff0c;希望对加大有用&#xff0c;欢迎收藏。 面试课程&#xff1a; 1、前端开发技术面试指南及真题讲解带你入坑BAT 这门课程主要针对想要进入BAT&#xff08;百度、阿里巴巴、腾讯&#…

(11)电调和电机

文章目录 前言 1 电机 2 无刷电机ESC 2.1 协议 2.2 使用BLHeli32或BLHeli-S配置固件的ESC 2.3 遥测 3 ESC接线和大型QuadPlane ESC问题 前言 ArduPilot 支持各种 ESC、电机和电子燃油系统。以下页面提供了最流行类型的设置说明。 ArduPilot 支持各种 ESC、电机和电子燃…

[oeasy]python0032_ 火星文字幕_os_操作系统的作用_time_sleep_延迟

火星文字幕_os_操作系统的作用_time_sleep_延迟 &#x1f94b; 回忆上次内容 这次我们了解了unix系统 在multics项目失败后汤普森和里奇 为了 玩游戏自制了 unix 这个世界从此有了 操作系统operating systemos 这个os有什么用吗&#xff1f;&#x1f914; 回忆shell执行…

Qt技巧(二)-滑动界面,轮询控件,循环操作控件

在Qt界面开发过程中&#xff0c;我们常常要对同类部件&#xff0c;具有同样功能的一系列部件进行操作&#xff0c;比如&#xff1a; 这个页面该怎么设计&#xff0c;中间的几个选项该怎么操作&#xff1f; 我们在主工程中添加一个设计师界面类&#xff0c;类名设置为“BrandF…

【pytorch】torch、torchaudio、torchvision版本对应关系

在官网查询版本对应关系 https://pytorch.org/get-started/previous-versions/

【论文阅读】语义通信安全研究综述(2024)

摘要 语义通信系统架构 笔记 内容概述 引言&#xff1a;介绍了语义通信技术的背景、发展和重要性&#xff0c;以及它在无线通信系统中面临的安全挑战。 语义通信系统架构及安全攻击&#xff1a;描述了一个端到端的深度学习语义通信系统的基本架构&#xff0c;包括语义编解码…

会议记录|MAS Lab 年度组会记录

前言&#xff1a;本篇博客记录 20240831 MAS Lab 第一次大组会要点。 “预测未来最好的方式就是创造它” —— 面向对象之父 Alan Kay 张老师提及 The MIT Media Lab &#xff08;中国多媒体大会上了解到的这个实验室&#xff09;&#xff0c;用技术带动产业发展、创造生态。 …

在工作中,这些问题,你是不是已经忍了很久?

在工作中&#xff0c;这些问题&#xff0c;你是不是已经忍了很久&#xff1f;每次找文件像在翻垃圾堆&#xff0c;办公室里纸山堆积得让人喘不过气。关键资料丢失让你夜不能寐&#xff0c;数据出错让你心烦意乱。面对这些反复出现的麻烦&#xff0c;你是否已经感到无比沮丧和焦…