Shell编程从入门到精通——正则表达式

Shell学习从入门到精通(一) 本章重点讲解变量内容 阅读详情

所谓正则表达式就是用来描述某些字符串匹配规则的工具。

一、什么是正则表达式

在程序的设计过程中,用户不可避免的需要进行文本的操作,而处理文本信息的时候通过正则表达式匹配想要的字符,可以避免通过复杂的代码来过滤文本,从而可以大大提高程序的可读性。

二、正则表达式基础

1. 正则表达式原理

通过正则表达式可以过滤文本,它通过定义一些列的元字符,通过元字符配合其他字符来表达一种规则,只有符合该规则的文本才能保留下来,不符合的就会被过滤掉。
所谓元字符是指用来描述字符的字符。元字符的作用在于对字符表达式的内容、转换以及各种操作信息进行描述。而正则表达式就是由各种字符和元字符构成的字符串。

输入文本
正则表达式
符合规则的文本
不符合规则的表达式
2. 基本正则表达式
2.1 行首定位符“^”

“^”称为行首定位符,是正则表达式中的定位符之一,用来匹配行首的字符,表示行首的字符是以“^”后面接的那个字符。

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Hello World
My name is random_w
Good
He
EOF`
#过滤以He开头的行
echo "${Str}" | grep "^He"

Output:

$ sh test.sh
Hello World
He
2.2 行尾定位符“$”

行尾定位符用来定位行尾,如下例:

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Hello World
My name is random_w
Good
He
EOF`
#过滤以He结尾的行
echo "${Str}" | grep "He$"

Output:

$ sh test.sh
He

注意:我们可以使用"^$"匹配空行。

2.3 单个字符匹配“.”

圆点用来匹配单个任意字符,包括空格,但是不包括换行符。

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Abc
AAc
BAc
Amc
EOF`

echo "${Str}" | grep "A.c"

Output:

$ sh test.sh
Abc
AAc
Amc
2.4 限定符“*”

星号是正则表达式中的限定符之一,。限定符本身不包含任何字符,它用来指定前一个字符出现的次出,星号表示前一个字符出现任意次数,包括零次。

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Abc
AAc
BAc
Amc
EOF`
#匹配A后面接任意字符,任意次数的值
echo "${Str}" | grep "A.*"

Output:

$ sh test.sh
Abc
AAc
BAc
Amc
2.5 字符集匹配“[]”
#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Abc
AAc
BAc
Amc
EOF`
#匹配ABc AAc
echo "${Str}" | grep "A[BA]c"

Output:

$ sh test.sh
AAc

注意:对于连续数字或者字母可以使用“-”来表示一个范围,如[1-10]表示匹配一到十中的任意字符。

2.6 字符集不匹配“[^]”

当中括号里面有一个"^"时,表示匹配除括号里面出现的字符以外的其他字符。

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Abc
AAc
BAc
Amc
EOF`

echo "${Str}" | grep "A[^BA]c"

Output:

$ sh test.sh
Abc
Amc

注意:当星号和圆点等字符位于匹配集中时,便成为了普通字符,只有字面意义,没有特殊含义。
下表列出了其他基本的正则表达式:

元字符说明举例
\(\)定义子表达式的开始和结束的位置。在后续正则表达式中可以通过转义的序号来引用子正则表达式。最多可以定义9个子正则表达式,通过\1~\9来引用。如:"\(love\).*\1",表示匹配两个love中包含任意字符的文本行,其中\1表示引用前面的love
x\{m,n\}区间表达式,匹配字符x重复出现的次数区间。其中x\{n}\表示最多重复n次,x\{m,\}表示最少重复m次,x\{m,n\}表示重复m~n次如:“a\{2,3\}”表示匹配字符a出现2~3次。
\<词首定位符如:“<hello”表示匹配以hello开头的单词
\>词尾定位符如:“>hello”表示匹配以hello结尾的单词
3. 扩展正则表达式

扩展正则表达式支持比基本正则表达式更多的元字符,但是扩展正则表达式对某些基本正则表达式所支持的元字符并不支持。

3.1 限定符“+”

加号和星号类似,也是一个用来限定字符出现的次数的,但是加号修饰的字符至少出现依次。

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Abc
AAc
BAc
Amc
EOF`

echo "${Str}" | egrep "A+"

Output:

$ sh test.sh
Abc
AAc
BAc
Amc

注意:grep命令使用的基本正则表达式,egrep使用的是扩展正则表达式。

3.2 限定符“?”

限定符问好,表示前面的字符出现一次或者零次。

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Abc
AAc
BAc
Amc
EOF`

echo "${Str}" | egrep "A?c"

Output:

$ sh test.sh
Abc
AAc
BAc
Amc
3.3 竖线"|“和圆括号”()"

竖线表示匹配多个正则表达式,也就是或的意思,语法为:
expression1|expression2|expression3|...|expressionn
圆括号用来表示一组可选的集合,竖线和圆括号经常一起使用。

#! /usr/bin/env bash

#给数组赋值
Str=`cat <<EOF
Abc
AAc
BAc
Amc
EOF`

echo "${Str}" | egrep "(Abc|Amc|BAc)"

Output:

$ sh test.sh
Abc
BAc
Amc

注意:扩展正则表达式取消了子表达式“()”和次数表达式“{m,n}”语法符号的转义符号引用语法,因此在使用这两种语法的时候不需要加反斜杠转义。

4. Perl正则表达式

在Shell中的grep和egrep都支持Perl正则表达式。

4.1 数字匹配\d

符号\d匹配0~9中的任意数字字符,等价于表达式[0-9]。

4.2 非数字匹配\D

符号\D和\d的作用正好相反,他匹配一个非数字字符等价于[^0-9]

4.3 空白字符匹配\s

符号\s匹配任何空白字符,包括空格、制表符以及换页符等,等价于[\f\n\r\t\v]

4.4 非空白字符匹配\S

符号\S匹配任何非空字符,等价于[^\f\n\r\t\v]

5. 正则表达式的字符集

前面说了使用中括号可以作为一个字符集,同样我们可以使用POSIX字符集。POSIX字符集是为了不同国家的字符编码保持一致而定义的特殊字符集。
下表为常用的POSIX字符集:

字符类说明
[:alnum:]匹配任意一个字母或者数字。
[:alpha:]匹配任意一个字母
[:digit:]匹配任意一个数字
[:lower:]匹配任意一个小写字母
[:upper:]匹配任意一个大写字母
[:space:]匹配任意一个空白字符
[:blank:]匹配空格和制表符
[:graph:]匹配任意一个看得见的打印字符,不包括空白字符
[:print:]匹配任何一个可以打印的字符,包括空白字符,但不包括控制字符、字符串结束符“\0”、EOF文件结束符(-1)
[:cntrl:]匹配任何一个控制字符,即ASCII字符集中的前32个字符。
[:punct:]匹配任何一个标点符号
[:xdidit:]匹配十六进制数字

与其他普通字符一样,上表中的字符类也需要放到方括号中使用,例如[[:alnum:]]与[a-zA-Z0-9]等价。

三、正则表示运算符的优先级

正则表达式按照从左到右的顺序进行计算,并且遵循一定的优先级,这一点与算术运算符类似,下表从高到低列出了正则表达式的优先级。

运算符说明
|转义符
[]方括号表达式
()分组
*、+、?、{m}、{m,}、{m,n}限定符
普通字符按照从左到右的顺序
^、$定位符
|或运算符

四、grep命令

grep命令的名称来自于全局搜索正则表达式并打印文本行的缩写,grep命令的语法如下:
grep [oprion] pattern [file...]
option表示选项如下表,pattern表示要匹配的模式,file表示一系列的文件名称。grep命令会从一个或者多个文件中搜索满足指定模式的文本行,并打印出来。

选项说明
-c只打印匹配到的文本行的行数,不显示匹配的内容
-i匹配时忽略字母的大小写
-h当搜索多个文件时,不显示匹配文件名前缀
-l只列出含有匹配的文本行的文件名,而不显示具体的内容
-n列出所有的匹配的文本行,并显示行号
-s不显示关于不存在或者无法读取文件的错误信息
-v只显示不匹配的文本行
-w匹配整个单词
-x匹配整个文本行
-r递归搜索,不仅搜索当前目录,还要搜索其他各级子目录
-q禁止输出任何匹配结果,而是以退出状态码的形式表示搜索是否成功,其中0表示匹配到了内容。
-b打印匹配的文本行到文件头的偏移量,以字节为单位
-E支持扩展正则表达式
-P支持Perl正则表达式
-F不支持正则表达式,将模式按照字面意思匹配
Linux Shell学习资料:编程艺术与实战攻略 Linux Shell 是 Linux 系统下的一个用户与系统交互的命令解释器,是用户与内核之间通信的桥梁。它提供了一个界面,允许用户执行命令,运行程序,并且控制计算机。Shell 作为一种编程语言,拥有自己的语法,可以编写脚本实现自动化任务。在Shell编程中,变量是对数据的抽象,用于存储临时信息和传递数据。变量的定义很简单,只需在变量名前加上一个美元符号即可。Shell中的变量无需声明类型,它们可以存储不同类型的数据。/bin/bash# 定义变量并赋值# 输出变量内容。 阅读详情

相关推荐

MTK MT6833平台屏幕与TP驱动移植实战:从FAE伪代码到内核模块集成

本文详细介绍了在MTK MT6833平台上进行屏幕与TP驱动移植的完整实战流程。文章从解析供应商提供的初始化伪代码入手,逐步拆解了在LK阶段点亮屏幕、在内核层集成Panel驱动以支持休眠唤醒,以及移植并调试sitronix_ts触摸驱动的核心步骤与关键技巧,为嵌入式开发人员提供了从零到一集成新硬件的清晰指南。

rnn9storyteller的博客 441

十四、正则表达式 - 章节课后练习题及答案

正则表达式 - 章节课后练习题及答案,使用的是人民邮电出版社出版的《JavaScript+jQuery 交互式 Web 前端开发》书籍。

熊先森的博客 3964

算法笔记 经典取石子游戏总结 博弈论

经典取石子游戏总结 1.巴什博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个,最多取m个,先取完者获胜(即没有石子取的人失败)。A与B都足够聪明,问A能否获胜。 结论:当n%(m+1)!=0时A必胜,否则必败。 2.斐波那契博弈 有一堆石子共n个,A和B轮流取,A先取。每次最少取1个。第一次不能取完。从第二次开始,每个人取的石子数至少为1,至多为前一个人取的石子数的2倍。先取完者获胜。...

CraigMC的博客 2936

POSIX常用字符集合

在正则匹配的时候,有的时候需要匹配一些特殊字符,比如说空格,TAB,标点符号,控制字符,大小写字码,16进制等...如果纯粹是大小写字符的话, [A-Z]  可以匹配大写字母 [a-z]  可以匹配小写字母 [0-9]  这些可以匹配数字 但像TAB键,空格键,空白符,16进制字母等,就不太好匹配! 好在POSIX有个固定的字符集,可供我们使用: 类型                  

杰瑞的专栏 2818

微信爬虫服务器,微信文章爬虫使用教程 - 八爪鱼采集器

对于某些用户来说,直接自定义规则可能有难度,所以在这种情况下,我们提供了网页简易模式,网页简易模式下存放了国内一些主流网站爬虫采集规则,在你需要采集相关网站时可以直接调用,节省了制作规则的时间以及精力。微信文章采集下来有很多作用,比如可以将自己行业中最近一个月之内发布的内容采集下来,然后分析文章标题和内容的一个方向与趋势。所以本次介绍八爪鱼简易采集模式下“搜狗公众号”的使用教程以及注意要点。步骤一...

weixin_26712065的博客 3259

KVM环境下Tesla T4/v100 vGPU性能调优手册:显存分配策略与帧率限制解除

本文深入探讨了在KVM虚拟化环境中,针对NVIDIA Tesla T4和V100 GPU进行vGPU性能调优的实战策略。核心内容包括如何根据AI训练、科学计算等不同负载,精细规划显存分配策略,并详细介绍了通过修改sysfs参数解除帧率限制器(FRL)以释放硬件潜力的方法,旨在帮助用户实现虚拟化GPU资源的最大化利用。

cuda7parallel的博客 619

正则表达式匹配行首和行尾

在平常我们经常有这样的一种场景,需要在行首或者行尾加上一个分号或者双引号,这个时候如果每行都是对齐的,我们可以使用列编辑的方式,如果每行不是对齐的,怎么办呢?我们可以使用正则表达式来匹配行首和行尾。 行首: ^ 行尾: $ 然后我们就可以批量的来对行首和行尾进行处理了。 ...

远方的少年 9918

SAP S/4HANA 中 RAP 业务对象接口的消费模式

本文探讨了SAP S/4HANA中RAP业务对象接口的消费模式,重点介绍了通过EML直接调用和CDS投影两种Clean Core开发路径。文章分析了BO Interface作为稳定契约的价值,并提供了BAdI集成、OData服务发布等实际场景案例,同时对比了OData V2/V4的技术选型考量,最后强调了ADT向导使用中的DCL权限注意事项。全文旨在帮助开发者构建升级友好的业务对象消费方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 758

正则表达式

1、非打印字符:非打印字符的转义序列 2、特殊字符:若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面 3、限定符:限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配 /[1-9][0-9]*/ #匹配一个正整数 /[0-9]{1,2}/ #至少指定一位但至多两位数字, 0~99 的两位数 /[1-9][0-9]?/ #匹配 1~99 的正整数表达式 /[1-9][0-9]{0,1}/ * 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在

buzhiquxiang的博客 1853

044、Edge Impulse的音频分类实战

上周调试一块STM32WBA52开发板,板载PDM麦克风死活采不到有效数据。示波器怼上去,时钟线波形漂亮得像教科书,数据线却像心电图——全是毛刺。折腾半天发现是电源纹波干扰,给麦克风单独加了个LC滤波,世界清净了。这种坑,做音频分类的嵌入式工程师迟早要踩一遍。

2401_88858637的博客 55

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1202

1.16 正则表达式

正则表达式目录正则表达式分类1. 基本正则表达式2. 扩展正则表达式 正则表达式分类 1. 基本正则表达式 //元字符 . //任意单个字符 [] //匹配指定范围内的任意单个字符 [^] //匹配指定范围外的任意单个字符 //匹配次数(贪婪模式) * //匹配其前面的任意单个字符任意次 ...

Yusyang_的博客 693

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

【4. BSP开发指南 - [4.6. 安全启动使用说明]】

Sugar_wolf的博客 275

4.Shell 编程从入门到精通 --- 正则表达式

1.什么是正则表达式 正则表达式有2种基本字符匹配:特殊字符和一般字符。 ^ 字符串的开始 $ 字符串的结束 . 除了匹配换行符以外的任何字符 * 匹配0个或者多个先前字符 [...] 匹配括号内的任意一个字符 x{m,n} 匹配 x 字符串出现的次数 ? 匹配1个或者多个先前字符 \w 匹配文字或者数字字符 \W 匹配一个或者多个非单词字符 1.POSIX字符集 ...

enlyhua的专栏 173

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

linux命令行和shell脚本编程宝典pdf版下载

目录回到顶部↑ 第1部分 linux命令行  第1章 linux shell入门   第2章 了解shell   第3章 基本的bash shell命令   第4章 更多bash shell命令   第5章 使用linux环境变量   第6章 理解linux文件权限   第7章 使用编辑器  第2部分 shell脚本的基础知识  第8章 基本脚本编译  ...

weixin_34239169的博客 624

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

gnu linux额外支持的运算符,《Shell编程从入门到精通》张昊-chap1-8

缘起20190314开始复习及学习吧;张昊编著;内容目录 i(9/314)全书11章chap1 第1个Shell程序 1(13/334)1.1、第一道菜[echo.sh]#!/bin/shcd /tmpecho "hello world!"(1)每一行代码是啥意思;(2)如何运行程序?1.2、如何运行程序1.2.1 选婿:位于第一行的#!匹配解释器。解释器路径可以用whereis bash查。自删...

weixin_39607473的博客 282

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Parallels Desktop深度解析:Apple Silicon下Windows虚拟化实战指南

虚拟机技术是实现跨平台协同的核心基础设施,其本质是通过硬件辅助虚拟化(如ARMv8.3-A VHE指令集)在宿主系统上构建隔离、可控的运行环境。原理层面依赖Hypervisor框架调度CPU、内存与I/O资源,并通过图形代理、输入融合、数据同步等协议栈实现操作系统级无缝集成。技术价值在于打破平台壁垒,提升开发、设计、教学等场景下的工作流连续性与设备复用率。典型应用场景包括macOS上运行Windows专属软件、ARM64架构下兼容x64应用、以及多系统协同调试。本文聚焦Parallels Desktop在A

weixin_34161029的博客 326

Shell脚本学习笔记(从入门到精通)

第1章 Shell概述 大数据程序员为什么要学习Shell呢? 1)需要看懂运维人员编写的Shell程序。 2)偶尔会编写一些简单Shell程序来管理集群、提高开发效率。 第2章 Shell解析器 (1)Linux提供的Shell解析器有: [root@MissHou ~]$ cat /etc/shells /bin/sh #是bash的一个快捷方式 /bin/bash #bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能 /sbin/nologin #表示非交互

努力让自己发光,对的人才能迎着光而来 1万+

【Shell编程】Shell从入门到精通

文档名称 Shell 从入门到精通 作者信息 李振良(阿良) 技术博客 http://blog.51cto.com/lizhenliang 说明 本文档均为个人经验总结,转发请保留出处,抵制不道德行为。 文档会不定期修改或新增知识点,请关注群动态或微信公众号获取 最新文档。 最后更新时间 2019-2-1 第一章 Shell基础知识 1.1 简介Shell是一个C语言编写的...

就叫一片白纸的博客 2673

Bash Shell:从入门到精通

本书旨在将读者从对命令行一无所知的“入门者”培养成能够利用Shell解决复杂问题的“精通者”。内容编排遵循认知规律,从基础概念到高级应用,从技术细节到思想哲学,层层递进,理论与实践紧密结合,强调“知其然,更知其所以然”。

YunWisdom 2598

2.Shell 编程从入门到精通 --- Shell编程基础

1.向脚本传递参数 如果你拥有的参数多于9个,则不能使用$10来引用第10个参数。首先,必须处理或保存第一个参数($1),然后使用 shift 命令删除参数1. 2.管道与重定向 > 改变输出 < 改变输入 >> 追加 | 建立管道 3.文件描述符 1.文件描述符表 2.系统文件表 3.内存索引节点表 每个进程维护自己的文件描述符表。当进...

enlyhua的专栏 275

shell学习从入门到精通

Shell 有一系列内置变量,用于获取脚本运行时的信息/bin/bash# 保存为 args.sh,执行:./args.sh a b cecho "脚本名:$0" # 输出:脚本名:./args.shecho "第1个参数:$1" # 输出:第1个参数:aecho "参数总数:$#" # 输出:参数总数:3echo "所有参数(\$*):$*" # 输出:所有参数($*):a b c# 遍历 $@(每个参数独立处理)echo "遍历 \$@:"do。

weixin_42795092的博客 1122

Linux Shell编程从初学到精通

<br /><br />华清远见系列图书<br />Linux Shell编程从初学到精通<br />华清远见嵌入式培训中心 伍之昂 等编著<br />ISBN 978-7-121-12305-4<br />2011年2月出版<br />定价:58.00元(含DVD光盘1张)<br />16开<br />468 页<br />内 容 提 要<br />Shell是用户与内核进行交互操作的一种接口,是Linux最重要的软件之一。目前最流行的Shell称为bash Shell,bash Shell脚本编程以其简

Broadview专栏 2302

shell从入门到精通

shell是一个命令解释器,主要用来接收用户的指令,然后驱动操作系统或硬件。Linux里有很多种shell,例如:Bourne Shell(/usr/bin/sh或/bin/sh)shell脚本就是把命令全部放在一起执行shell脚本里可以包含若干个变量,循环,if判断,for循环,函数等变量+函数+流程控制+条件判断+shell命令 = shell脚本变量是Shell传递数据的一种方式。以一个固定的字符串去表示一个不固定的值,便于后续的复用和维护。

weixin_73388622的博客 1068
上一篇: Shell编程从入门到精通——数组
下一篇: Go语言成长路线
random_w
博客等级 码龄9年 130粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值