【Linux命令行与Shell脚本编程】第十九章 正则表达式

Linux命令行与Shell脚本编程 第十九章 正则表达式


文章目录

  • Linux命令行与Shell脚本编程 第十九章 正则表达式
  • 九.正则表达式
    • 9.1.正则表达式基础
      • 9.1.1.正则表达式的类型
      • 9.2.定义BRE模式
        • 9.2.1.普通文本
        • 9.2.2.特殊字符
      • 9.2.3.锚点字符
        • 锚定行首^
        • 锚定行尾$
        • 组合锚点
      • 9.2.4.点号字符\.
      • 9.2.5.字符组[]
      • 9.2.6.排除字符组
      • 8.2.7.区间
      • 9.2.8.特殊字符组
      • 9.2.9.星号*
    • 9.3.扩展正则表达式
      • 9.3.1.问号?
      • 9.3.2.加号+
      • 9.3.3.花括号\{\}
      • 9.3.4.竖线符号\|
      • 9.3.5.表达式分组
    • 9.4.实战
      • 9.4.1.目录文件计数


九.正则表达式

  • 正则表达式基础
  • 定义BRE模式
  • 扩展正则表达式

在sed和gawk中创建正则表达式,以得到所需的数据。

9.1.正则表达式基础

正则表达式是一种可供Linux工具过滤文本的自定义模板,使用元字符来描述数据流中的一个或多个字符.
Linux工具(比如sed或gawk)会在读取数据时使用正则表达式对数据进行模式匹配。如果数据匹配模式,它就会被接受并进行处理。
正则表达式包含文本和/或特殊字符.

9.1.1.正则表达式的类型

不同的应用程序可能使用不同类型的正则表达式。
编程语言(Java、Python)、Linux工具(sed、gawk和grep)以及主流应用程序(MySQL数据库服务器)。

正则表达式由正则表达式引擎实现。这种底层软件,负责解释正则表达式并用这些模式进行文本匹配。

Linux 中流行的两种:

  • POSIX基础正则表达式(basic regular expression,BRE)引擎。
  • POSIX扩展正则表达式(extended regular expression,ERE)引擎。

大多数Linux工具至少符合POSIX BRE引擎规范。但有些工具(比如sed)仅符合BRE引擎规范的一个子集。
(出于速度方面的考虑导致,sed希望尽可能快地处理数据流中的文本)

POSIX ERE引擎多见于依赖正则表达式过滤文本的编程语言中。为常见模式(比如数字、单词以及字母或数字字符)提供了高级模式符号和特殊符号。
gawk就是使用ERE引擎来处理正则表达式。

9.2.定义BRE模式

最基本的BRE模式是匹配数据流中的文本字符.

9.2.1.普通文本

正则表达式对大小写敏感.
正则表达式并不关心模式在数据流中出现的位置,也不在意模式出现了多少次。
只要能匹配文本字符串中任意位置的模式,正则表达式就会将该字符串传回Linux工具。

在正则表达式中,空格和其他的字符没有区别.如果在正则表达式中定义了空格,那么必须出现在数据流中。甚至可以创建匹配多个连续空格的正则表达式.

$ cat data1
This is a normal line of text.
This is  a line with too many spaces.
$ sed -n '/  /p' data1
This is  a line with too many spaces.

9.2.2.特殊字符

正则表达式中的一些字符具有特别的含义:

  • .
  • *
  • []
  • ^
  • $
  • {}
  • \
  • +
  • ?
  • |
  • ()

不能在匹配普通文本的模式中单独使用这些字符.
如果要将某个特殊字符视为普通字符,则必须将其转义.使用特殊转移字符反斜线(\)。

尽管正斜线 / 不属于正则表达式的特殊字符,但如果出现在sed或gawk的正则表达式中,就会出现错误,所以正斜线也需要进行转义.

9.2.3.锚点字符

默认情况下,当指定一个正则表达式模式时,只要模式出现在数据流中的任何地方,它就能匹配.有两个特殊字符可以用来将模式锁定在数据流中的行首或行尾。

锚定行首^

脱字符(^)可以指定位于数据流中文本行行首的模式。如果模式出现在行首之外的位置,则正则表达式无法匹配。
使用脱字符,就必须将其置于正则表达式之前

$ echo "The book store" | sed -n '/^book/p'
$
$ echo "Books are great" | sed -n '/^Book/p'
Books are great

如果将脱字符放到正则表达式开头之外的位置,那么就跟普通字符一样,没有特殊含义

$ echo "This ^ is a test" | sed -n '/s ^/p'
This ^ is a test

如果正则表达式模式中只有脱字符,就不必用反斜线来转义。但如果在正则表达式中先指定脱字符,随后还有其他文本,就必须在脱字符前用转义字符.

$ echo "This is ^ a test" | sed -n '/^ a test/p'
$ echo "This is ^ a test" | sed -n '/\^ a test/p'
This is ^ a test

锚定行尾$

与在行首查找模式相反的情况是在行尾查找。特殊字符美元符号($)定义了行尾锚点。将这个特殊字符放在正则表达式之后则表示数据行必须以该模式结尾.

$ echo "This is a good book" | sed -n '/book$/p'
This is a good book

组合锚点

组合使用行首锚点和行尾锚点。

$ cat data4
this is a test of using both anchors
I said this is a test
this is a test
I'm sure this is a test.
$ sed -n '/^this is a test$/p' data4
this is a test

将这两个锚点直接组合,之间不加任何文本,可以过滤掉数据流中的空行。
组合 删除命令d就可以删除掉文本中的空行.

$ cat data5
This is one test line.This is another test line.
$ sed '/^$/d' data5
This is one test line.
This is another test line.

9.2.4.点号字符.

点号字符可以匹配除换行符之外的任意单个字符。(空格也是字符,可以匹配)
点号字符必须匹配一个字符,如果在点号字符的位置没有可匹配的字符,那么模式不成立。

$ cat data6
This is a test of a line.
The cat is sleeping.
That is a very nice hat.
This test is at line four.
at ten o'clock we'll go home.
$ sed -n '/.at/p' data6
The cat is sleeping.
That is a very nice hat.
This test is at line four.

9.2.5.字符组[]

想要限定要匹配的具体字符使用字符组.
可以在正则表达式中定义用来匹配某个位置的一组字符。如果字符组中的某个字符出现在了数据流中,那就能匹配该模式。

方括号 [] 用于定义字符组。
在不太确定某个字符的大小写时非常适合使用字符组.

$ echo "Yes" | sed -n '/[Yy]es/p'
Yes
$ echo "yes" | sed -n '/[Yy]es/p'
yes

在一个正则表达式中可以使用多个字符组.
可以将多个字符组组合在一起,以检查数字是否具备正确的格式.

$ cat data8
60633
46201
223001
4353
22203
$ sed -n '
> /^[0123456789][0123456789][0123456789][0123456789][0123456789]$/p
> ' data8
60633
46201
22203

9.2.6.排除字符组

在正则表达式中,可以反转字符组的作用:匹配字符组中没有的字符。在字符组的开头添加脱字符^:

$ sed -n '/[^ch]at/p' data6
This test is at line four.

即使是排除型,字符组仍必须匹配一个字符,以at为起始的行还是不能匹配模式!!!

8.2.7.区间

可以用单连字符在字符组中表示字符区间。只需指定区间的第一个字符、连字符以及区间的最后一个字符。
根据Linux系统使用的字符集,字符组会包括在此区间内的任意字符。

$ sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data8
60633
46201
45902

同样的方法也适用于字母:

$ sed -n '/[c-h]at/p' data6
The cat is sleeping.
That is a very nice hat.

可以在单个字符组内指定多个不连续的区间:

$ sed -n '/[a-ch-m]at/p' data6
The cat is sleeping.
That is a very nice hat.

9.2.8.特殊字符组

BRE还提供了一些特殊的字符组,用来匹配特定类型的字符。

字符组描述
[[:alpha:]]匹配任意字母字符,无论大小写
[[:alnum:]]匹配任意字母和数组字符,0-9、a-z、A-Z
[[:blank:]]匹配空格和制表符
[[:digit:]]匹配0-9的数字
[[:lower:]]匹配a-z的字母
[[:upper:]]匹配A-Z的字母
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配标点符号
[[:space:]]匹配任意空白字符:空格、制表符、换行符、分页符、垂直制表符、回车符

特殊字符组在正则表达式中的用法和普通字符组一样:

$ echo "abc" | sed -n '/[[:digit:]]/p'
$ echo "abc" | sed -n '/[[:alpha:]]/p'
abc
$ echo "abc123" | sed -n '/[[:digit:]]/p'
abc123
$ echo "This is a test" | sed -n '/[[:punct:]]/p'
$ echo "This is, a test" | sed -n '/[[:punct:]]/p'
This is, a test

9.2.9.星号*

在字符后面放置星号,表明该字符必须在匹配模式的文本中出现0次或多次.

$ echo "ik" | sed -n '/ie*k/p'
ik
$ echo "iek" | sed -n '/ie*k/p'
iek
$ echo "ieek" | sed -n '/ie*k/p'
ieek
$ echo "ieeek" | sed -n '/ie*k/p'
ieeek
$ echo "ieeeek" | sed -n '/ie*k/p'
ieeeek

某些单词在英美中不同,借助 星号可以匹配:

$ echo "I'm getting a color TV" | sed -n '/colou*r/p'
I'm getting a color TV
$ echo "I'm getting a colour TV" | sed -n '/colou*r/p'
I'm getting a colour TV
$

将点号字符和星号字符组合起来。这个组合能够匹配任意数量的任意字符:

$ echo "this is a regular pattern expression" | sed -n '
> /regular.*expression/p'
this is a regular pattern expression

星号用于字符组时,指定可能在文本中出现0次或多次的字符组或字符区间:

$ echo "bt" | sed -n '/b[ae]*t/p'
bt
baaeeet
$ echo "baeeaeeat" | sed -n '/b[ae]*t/p'
baeeaeeat
$ echo "baakeeet" | sed -n '/b[ae]*t/p'

9.3.扩展正则表达式

POSIX ERE模式提供了一些可供Linux应用程序和工具使用的额外符号。gawk支持ERE模式,sed不支持。

可用于gawk脚本中的常见ERE模式符号。

9.3.1.问号?

问号表明字符可以出现0次或1次,不会匹配多次出现的该字符.用法与星号类似,可以作用与字符组.

$ echo "bt" | gawk '/be?t/{print $0}'
bt
$ echo "bet" | gawk '/be?t/{print $0}'
bet
$ echo "beet" | gawk '/be?t/{print $0}'

9.3.2.加号+

加号表明前面的字符可以出现1次或多次,必须至少出现1次。用法与星号类似,可以作用与字符组.

$ echo "bt" | gawk '/b[ae]+t/{print $0}'
$
$ echo "bat" | gawk '/b[ae]+t/{print $0}'
bat
$ echo "bet" | gawk '/b[ae]+t/{print $0}'
bet
$ echo "beat" | gawk '/b[ae]+t/{print $0}'
beat
$ echo "beet" | gawk '/b[ae]+t/{print $0}'
beet
$ echo "beeat" | gawk '/b[ae]+t/{print $0}'
beeat

9.3.3.花括号{}

ERE中的花括号允许为正则表达式指定具体的可重复次数,称为区间。

可以用两种格式来指定区间:

  • m:正则表达式恰好出现m次。
  • m, n:正则表达式至少出现m次,至多出现n次。

默认情况下,gawk也不识别正则表达式区间,必须指定gawk的命令行选项–re-interval。

$ echo "bt" | gawk --re-interval '/be{1}t/{print $0}'
$
$ echo "bet" | gawk --re-interval '/be{1}t/{print $0}'
bet
$ echo "beet" | gawk --re-interval '/be{1}t/{print $0}'
$
$ echo "bt" | gawk --re-interval '/be{1,2}t/{print $0}'
$
$ echo "bet" | gawk --re-interval '/be{1,2}t/{print $0}'
bet
$ echo "beet" | gawk --re-interval '/be{1,2}t/{print $0}'
beet
$ echo "beeet" | gawk --re-interval '/be{1,2}t/{print $0}'
$
$ echo "bt" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
$
$ echo "beet" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
beet
$ echo "beeat" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
$

9.3.4.竖线符号|

竖线符号允许在检查数据流时,以逻辑OR方式指定正则表达式引擎要使用的两个或多个模式。任何一个模式匹配了数据流文本,就视为匹配。
竖线符号两侧的子表达式可以采用正则表达式可用的任何模式符号(包括字符组)

$ echo "The cat is asleep" | gawk '/cat|dog/{print $0}'
The cat is asleep
$ echo "The dog is asleep" | gawk '/cat|dog/{print $0}'
The dog is asleep
$ echo "The sheep is asleep" | gawk '/cat|dog/{print $0}'

9.3.5.表达式分组

用圆括号对正则表达式进行分组。分组之后,每一组会被视为一个整体,可以像对普通字符一样对该组应用特殊字符。

$ echo "Sat" | gawk '/Sat(urday)+/{print $0}'
$ echo "Saturday" | gawk '/Sat(urday)+/{print $0}'
Saturday

将分组和竖线符号结合起来创建可选的模式匹配组:

$ echo "cat" | gawk '/(c|b)a(b|t)/{print $0}'
cat
$ echo "cab" | gawk '/(c|b)a(b|t)/{print $0}'
cab
$ echo "bat" | gawk '/(c|b)a(b|t)/{print $0}'
bat
$ echo "bab" | gawk '/(c|b)a(b|t)/{print $0}'
bab
$ echo "tab" | gawk '/(c|b)a(b|t)/{print $0}'
$

9.4.实战

9.4.1.目录文件计数

对PATH环境变量中各个目录所包含的文件数量进行统计.

PATH中的各个路径由冒号分隔。要获取可在脚本中使用的目录列表,须用空格替换冒号.

$ echo $PATH | sed 's/:/ /g'
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
/usr/games /usr/local/games

分离出目录之后,可以使用标准for语句遍历每个目录:

mypath=`echo $PATH | sed 's/:/ /g'`
for directory in $mypath
do
...
done

对于单个目录,可以用ls命令列出其中的文件,再用另一个for语句来遍历每个文件,对文件计数器增值。

$ cat countfiles
#!/bin/bash
# count number of files in your PATH
mypath=$(echo $PATH | sed 's/:/ /g')
count=0
for directory in $mypath
docheck=$(ls $directory)for item in $checkdocount=$[ $count + 1 ]doneecho "$directory - $count"count=0
done
$ ./countfiles /usr/local/sbin - 0
/usr/local/bin - 2
/usr/sbin - 213
/usr/bin - 1427
...
/usr/local/games - 0

在这里插入图片描述

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

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

相关文章

funbox3靶场渗透笔记

funbox3靶场渗透笔记 靶机地址 https://download.vulnhub.com/funbox/Funbox3.ova 信息收集 fscan找主机ip192.168.177.199 .\fscan64.exe -h 192.168.177.0/24___ _/ _ \ ___ ___ _ __ __ _ ___| | __/ /_\/____/ __|/ __| __/ _ |/ …

SpringBoot复习(39)Servlet容器的自动配置原理

Servlet容器自动配置类为ServletWebServerFactoryAutoConfiguration 可以看到通过Import注解导入了三个配置类: 通过这个这三个配置类可以看出,它们都使用了ConditionalOnClass注解,当类路径存在tomcat相关的类时,会配置一个T…

Linux系列:从0到1用Docker部署springboot项目

目录 1.前提条件 2.编写DockerFile镜像文件 3.打包SpringBoot项目 4.通过软件Xftp进行传输(*) 1.点击“文件-新建”​编辑 5.操作远程主机 1.docker构建 2.容器运行 6.容器的关闭和删除 1.前提条件 Linux、docker、xftp的安装、一台可以访问的远…

教雅川学缠论07-中枢实战众泰汽车000980

本文实战众泰汽车 下面是2023年11月14-2023年8月8众泰汽车日K图 先画日K 接下来处理包含,就变成下面这个样子 下面在套上缠论的理论,未来股价的走势应该是红色椭圆形虚线里面的样子 好了,文章就到这里,如果众泰最终不是这个走势…

IDEA部署配置Maven项目教程,IDEA配置Tomcat(2019.3.3)

一、前言 当涉及到软件开发和项目管理时,使用一个可靠的构建工具是非常重要的。Maven是一个广泛使用的构建工具,它为Java项目提供了一种简化的构建过程和依赖管理。 在本文中,我们将探讨如何部署Maven并开始使用它来构建您的项目。我们将介绍…

开源数据库Mysql_DBA运维实战 (修改root密码)

MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法,大家可以可以根据的自己的情况自由选择,希望对大家有所帮助 方法1: 用SET PASSWORD命令 首先登录MySQL。 格式:mysql> set pass…

Android APK体积优化(瘦身)

1、基础知识: 1.1 apk结构 lib :存放so文件,对应不同的cpu架构 res :资源文件,layout、drawable等,经过aapt编译 assets :资源文件,不经过aapt编译 classes.dex :dx编译…

graphab 教程 ——生成廊道

Graphab软件包括图谱创建、基于图谱的连通性计算、分析与推广、制图四个模块。Graphab软件的图谱创建基于栅格数据进行,包括斑块识别和连接建立两个步骤。Graphab 软件可识别的栅格数据格式包括TIFF、ASCI和RST,栅格像元记录数值用于识别斑块类型,识别规则可以选择四邻域或八邻…

【Zabbix安装-5.5版本】

Zabbix安装(rpm包安装) Index of /zabbix/zabbix/5.5/rhel/8/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror rpm包链接:https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.5/rhel/8/x86_64/zabbix-release-5.5-1.e…

Unity3d C#利用本地网页快速打开萤石云监控视频流(ezopen)实现云台,声音等控制,支持WebGL平台,替代UMP播放(含源码)

前言 之前我介绍了替代Universal?Media?PlayerUMP播放石云监控视频流(ezopen)的功能,效果还是很明显的,笔者的测试是差不多3-5秒就能打开监控画面,不过稍微遗憾的是,之前的功能是iframe打开石云提供的播放网页的形式&#xff0…

详解拦截器和过滤器

目录 代码演示过滤器Demo拦截器Demo 过滤器自定义拦截器配置拦截器过滤器执行原理多个过滤器的执行顺序 拦截器自定义拦截器注册拦截器1)注册拦截器2)配置拦截的路径3)配置不拦截的路径 多个拦截器的执行顺序 过滤器和拦截器的区别 代码演示 …

【设计模式】桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得…

C++ 网络编程项目fastDFS分布式文件系统(二)-redis部分

目录 1. 数据库类型 1.1 基本概念 1.2 关系/非关系型数据库搭配使用 2. Redis 2.1 基本知识点 2.2 redis常用命令 - String类型 - List类型 - Set类型 - SortedSet 类型 - Hash类型 Key 相关的命令 2.3 redis配置文件 2.4 redis数据持久化 3 hiredis的使用 1. 数据…

原生js发送ajax请求---ajax请求篇(一)

在原生js中我们使用的是XMLHttpRequest对象来发送ajax请求 主要步骤就是: 1.创建XMLHTTPRequest对象 2.使用open方法设置和服务器的交互信息 3.设置发送的数据,开始和服务器端交互 4.注册事件 5.更新界面 (1) get方式 //步骤一…

使用python对图像加噪声

加上雨点噪声 import cv2 import numpy as npdef get_noise(img, value10):#生成噪声图像>>> 输入: img图像value 大小控制雨滴的多少 >>> 返回图像大小的模糊噪声图像noise np.random.uniform(0, 256, img.shape[0:2])# 控制噪声水平&#xff…

OPENCV C++(十二)模板匹配

正常模板匹配函数 matchTemplate(img, templatee, resultMat, 0);//模板匹配 这里0代表的是方法,一般默认为0就ok img是输入图像 templatee是模板 resultmat是输出 1、cv::TM_SQDIFF:该方法使用平方差进行匹配,因此最佳的匹配结果在结果为…

Excel(1):表头或列头冻结

1.需求 对于较大的excel,通常需要固定一部分内容,另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格,需要注意的是,选择冻结窗格时,窗格的左上方的表格区域是固定不动的,只可以向下或者向右活动。

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初步使用(二)

前言: 在前面一篇文章云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初始安装(一)_华为cna_晚风_END的博客-CSDN博客 介绍了基于VMware虚拟机里嵌套部署华为云的云计算,不过仅仅是做到了在VRM的web界面添加计算节点…

Android使用kotlin+协程+room数据库的简单应用

前言:一般主线程(UI线程)中是不能执行创建数据这些操作的,因为等待时间长。所以协程就是为了解决这个问题出现。 第一步:在模块级的build.gradle中引入 id com.android.application// roomid kotlin-androidid kotlin…