Shell中正则表达式和sed编译器

目录

一、正则表达式

1.元字符

2.表示次数

3.位置锚定

4.分组

5.扩展正则表达式

二、sed编译器

1.什么是sed编译器

2.sed编译器的工作流程

3.sed命令格式


一、正则表达式

1.元字符

①.:在正则表达式中.表示任意单个字符。

[root@pc1 data]#grep   -o r.t /etc/passwd #过滤passwd文件中开头为r中间任意单个字符结尾为t的内容
rat
rat
rat
[root@pc1 data]#grep   -o r..t /etc/passwd #过滤passwd文件中开头为r中间任意2个字符结尾为t的内容
root
root
root
root
r/ft
[root@pc1 data]#grep   -o r...t /etc/passwd #过滤passwd文件中开头为r中间任意3个字符结尾为t的内容
rtkit

②[  ]:在正则表达式中[ ]表示匹配[ ]中任意一个字符。

[root@pc1 data]#touch {a..c}.txt #创建a-c.txt文件夹
[root@pc1 data]#ls               #显示文件夹内容
a.txt  b.txt  c.txt 
[root@pc1 data]#ls |grep '[a-z].txt' #使用grep过滤ls中有任意一个a-z字母.txt的文件
a.txt
b.txt
c.txt

③[^]:在正则表达式中表示匹配[ ]中外的任意单个字符。

[root@pc1 data]#touch {a..c}.txt        #创建a-c.txt文件
[root@pc1 data]#touch {0..2}.txt        #创建0-2.txt文件
[root@pc1 data]#ls                      #显示文件
0.txt  1.txt  2.txt  a.txt  b.txt  c.txt
[root@pc1 data]#ls |grep '[^0-9].txt'   #过滤ls显示文件中除去0-9任意字符.txt文件
a.txt
b.txt
c.txt
[root@pc1 data]#ls |grep '[^a-z].txt'   #过滤ls显示文件中除去a-z任意字符.txt文件
0.txt
1.txt
2.txt
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[root@pc1 data]#echo AB12ab | grep -o '[[:alpha:]]'  #过滤输出内容的字母
A
B
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:alnum:]]'  #过滤输出内容的字母和数字
A
B
1
2
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:lower:]]'  #过滤输出内容的小写字母
a
b
[root@pc1 data]#echo AB12ab | grep -o '[[:upper:]]'  #过滤输出内容的大写字母
A
B

2.表示次数

①*:表示匹配前面字符任意次,包括0次。

[root@pc1 ~]#echo  ac |grep 'ab*c'  #ab之间不输入b可匹配
ac
[root@pc1 ~]#echo  abc |grep 'ab*c' #ab之间输入1个b可匹配
abc
[root@pc1 ~]#echo  abbc |grep 'ab*c'#ab之间输入2个b可匹配
abbc

②.*:表示匹配前面字符任意次,不包括0次。

[root@pc1 ~]#echo ac |grep 'ab.*c'  #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc |grep 'ab.*c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab.*c' #ac直接输入2个b可以匹配
abbc

③\?:表示匹配前面的字符1次或0次,即可有可无。

[root@pc1 ~]#echo ac | grep 'ab\?c'    #ac之间不输入b可以匹配
ac
[root@pc1 ~]#echo abc | grep 'ab\?c'   #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbc | grep 'ab\?c'  #ac之间输入2个b匹配不到 

④\+:表示匹配前面的字符最少1次。

[root@pc1 ~]#echo ac | grep 'ab\+c'  #ac之间不输入b匹配不到
[root@pc1 ~]#echo abc | grep 'ab\+c' #ac之间输入1个b可以匹配
abc
[root@pc1 ~]#echo abbbbc | grep 'ab\+c' #ac之间输入多个b可以匹配
abbbbc

⑤\{n\}:表示匹配前面的字符n次。

[root@pc1 ~]#echo abbbc |grep 'ab\{3\}c'  #输出abbbc匹配ac之间b字符出现3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{3\}c' #输出abbbbc匹配ac之间b字符出现3次匹配不到

⑥\{m,n\}:表示匹配前面的字符最少m次最多n次。

[root@pc1 ~]#echo abc |grep 'ab\{1,3\}c'  #输出abc匹配ac之间b出现最少1次最多3次可以匹配
abc
[root@pc1 ~]#echo abbc |grep 'ab\{1,3\}c' #输出abbc匹配ac之间b出现最少1次最多3次可以匹配
abbc
[root@pc1 ~]#echo abbbc |grep 'ab\{1,3\}c'#输出abbbc匹配ac之间b出现最少1次最多3次可以匹配
abbbc
[root@pc1 ~]#echo abbbbc |grep 'ab\{1,3\}c'#输出abbbbc匹配ac之间b出现最少1次最多3次匹配不到

⑦\{m,\}:表示匹配前面的字符最少m次。

⑧\{,n\}:表示匹配前面的字符最多n次。

3.位置锚定

①^表示以什么字符开头的行。

②$表示以什么字符为结尾的行。

③^PATTERN$ 表示用于模式匹配整行 (单独一行  只有PATTERN字符)。

④^$ 表示空行。

⑤\< 或 \b        #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)。

⑥\> 或 \b       #词尾锚定,用于单词模式的右侧。

⑦\<PATTERN\>    #匹配整个单词。

[root@pc1 ~]#cat a.txt                #查看a.txt内容 
root
abc   abd  abf abe 
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^a'     #查看a.txt内容过滤以a开头的行
abc   abd  abf abe 
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e$'     #查看a.txt内容过滤以e为结尾的行
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep '^root$' #查看a.txt内容过滤只有root字符的行
root
[root@pc1 ~]#cat a.txt |grep '\ba'    #查看a.txt过滤以a开头的词
abc   abd  abf abe 
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep 'e\b'    #查看a.txt过滤以e为结尾的词
abc   abd  abf abe 
asfase
asdfasfewe
[root@pc1 ~]#cat a.txt |grep -o '\babc\b' #查看a.txt过滤次abc
abc 

4.分组

()将多个字符捆绑在一起当做一个整体处理

[root@pc1 ~]#echo abcccc |grep "abc\{4\}"  #匹配输出内容c出现4次
abcccc
[root@pc1 ~]#echo abcccc |grep "\(abc\)\{4\}" #abc字符加()分组匹配输出内容abc出现4次,无abc出现4次匹配不到
[root@pc1 ~]#echo abcabcabcabc |grep "\(abc\)\{4\}"  #abc字符加()分组匹配输出内容abc出现4次匹配成功
abcabcabcabc

5.扩展正则表达式

①使用方法

grep  -E选项加正则表达式内容,与正常正则表达式区别在于不用在匹配时添加 \ 

②表示次数

*   匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n}  #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0

③表示分组

() 分组

二、sed编译器

1.什么是sed编译器

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

2.sed编译器的工作流程

sed 的工作流程主要包括读取、执行和显示三个过程:读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上.述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,
除非是用重定向存储输出或者sed -i.

3.sed命令格式

命令格式:

sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)

选项:

-e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;
-f<script文件>或--file=<script文件>:以选项中指定的script文件来处理输入的文本文件;
-h或--help:显示帮助;
-n或--quiet或——silent:仅显示script处理后的结果;
-V或--version:显示版本信息。

参数:

文件:指定待处理的文本文件列表。

常用操作:

操作作用
s替换,替换指定字符
d删除,删除选定的行
a增加,在当前行下面增加一行指定内容
i插入,在选定行上面插入一行指定内容
c替换,将选定行替换为指定内容
y字符转换,转换前后的字符长度必须相同
p
打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。
=打印行号
l打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

sed的查找替换使用

格式:sed '/可使用正则表达式选择范围/'s/查找内容/替换内容/g g表示全文,固定格式的///可以用###等符号替换

注意:查找内容可使用正则表达式,替换内容不可使用正则表达式

举例1:
搜索/etc/passwd 中包含root字符的行
sed -nr '/root/p'   /etc/passwd  #-n关闭自动打印,-r启用扩展正则表达式查询root字符并打印
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin   #查询结果
举例2:
使用sed关闭selinux
cat /etc/selinux/config   #查看selinux配置文件内容
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
#-i选项备份selinux配置文件后缀加.bak,在config文件中找到SELINUX=enforcing修改为SELINUX=disabled,g表示所有搜索到的内容都替换。单引号中''s之前可加行号

后向引用

( )内的按顺序标为123 ,引用时\1调用第一个()的内容,\n表示调用第n个()的内容。

.*表示任意长度字符不管是什么字符

举例1:取ip地址
ifconfig ens33 |sed -nr 's/.*inet (.*) netmask.*/\1/p'
#查看ens33的网卡信息传给sed处理,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式,.*inet 表示以inet为止的前面所有字符 (.*) 括号表示使用反向引用
.*表示该处的任意字符 netmask.*表示以netmask开头后面的所有字符。\1表示反向引用第一个()的
内容,p表示打印出来
192.168.30.11  #打印结果
举例2:
echo abc123XYZ | sed -nr 's/(abc)(123)(XYZ)/\3\2\1/p'
#打印abc123XYZ传给sed处理变成XYZ123ABC,-n选项关闭自动打印,-r选项开启扩展正则表达式
's///'查找替换标准格式。三个()括起来的内容分别表示元素123,调用时改变调用顺序打印即可改变内容顺序
XYZ123abc       #打印结果

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

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

相关文章

第一节 分布式架构设计理论与Zookeeper环境搭建

1. 分布式架构设计理论 学习Zookeeper之前,我们需要掌握一些分布式系统基础知识&#xff1a;了解分布式系统的概念、原理。 配置管理 域名服务 分布式同步 发布订阅 1. 分布式架构介绍 1.1 什么是分布式 《分布式系统原理和范型》一书中是这样定义分布式系统的&#xff1a…

【ArcGIS微课1000例】0099:土地利用变化分析

本实验讲述在ArcGIS软件中基于两期土地利用数据,做土地利用变化分析。 文章目录 一、实验描述二、实验过程三、注意事项一、实验描述 对城市土地利用情况进行分析时,需要考虑不同时期土地利用图层在空间上的差异性,如农用地转建筑用地的空间变化。而该变化过程表现为各时期…

C#学习笔记_字符串常用方法

ToUpper()/ToLower() 作用&#xff1a;将字符串中字符转换为大写/小写字符&#xff0c;仅对字符有效&#xff0c;返回转换后的字符串。 使用&#xff1a;字符串变量名.ToUpper() / 字符串变量名.ToLower() 使用实例如下&#xff1a; using System; using System.Collection…

C#,贝尔数(Bell Number)的计算方法与源程序

1 埃里克坦普尔贝尔 贝尔数是组合数学中的一组整数数列&#xff0c;以埃里克坦普尔贝尔&#xff08;Eric Temple Bell&#xff09;命名&#xff0c; 埃里克坦普尔贝尔&#xff08;生于1883年2月7日&#xff0c;苏格兰阿伯丁郡阿伯丁&#xff0c;于1960年12月21日在美国加利福尼…

2024年数学建模美赛C题(预测 Wordle)——思路、程序总结分享

1: 问题描述与要求 《纽约时报》要求您对本文件中的结果进行分析&#xff0c;以回答几个问题。 问题1&#xff1a;报告结果的数量每天都在变化。开发一个模型来解释这种变化&#xff0c;并使用您的模型为2023年3月1日报告的结果数量创建一个预测区间。这个词的任何属性是否会…

设计模式——模板方法模式(Template Method Pattern)

概述 模板方法模式&#xff1a;定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术&#xff0c;它是一种类行为型模式。模板方法模式是结…

【开源】JAVA+Vue.js实现超市商品管理系统

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

标准库中的string类(下)——“C++”

各位CSDN的uu们你们好呀&#xff0c;这段时间小雅兰的内容仍然是Cstring类的使用的内容&#xff0c;下面&#xff0c;让我们进入string类的世界吧&#xff01;&#xff01;&#xff01; string类的常用接口说明 string - C Reference string类的常用接口说明 string类对象的修…

一文理清楚-Docker 容器如何工作

Docker 容器如何工作 集装箱什么是虚拟机&#xff1f;虚拟化如何运作&#xff1f;什么是容器&#xff1f;什么是 Docker&#xff1f;总结 五星上将麦克阿瑟曾经说过&#xff1a;在docker面前&#xff0c;虚拟机就是个弟弟 集装箱 《盒子&#xff1a;集装箱如何让世界变得更小&…

【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“

帮同事排查一个gorm导入数据报错的问题 事发现场 ck sql CREATE TABLE ods_api.t_sms_jg_msg_callback_dis (app_key String DEFAULT COMMENT 应用标识,callback_type Int32 DEFAULT 0 COMMENT 0送达&#xff0c;1回执,channel Int32 DEFAULT 0 COMMENT uid下发的渠道,mode…

Hive环境准备

1.配置Hive环境变量 [rootnode1 /]# vim /etc/profile在profile文件末尾添加以下内容(小技巧Go快速定位到最后) export HIVE_HOME/export/server/apache-hive-3.1.2-bin export PATH P A T H : PATH: PATH:HIVE_HOME/bin:$HIVE_HOME/sbin [rootnode1 /]# source /etc/profile2…

THM学习笔记——SQL注入

简介 SQL注入&#xff0c;通常称为SQLi&#xff0c;是对 Web 应用程序数据库服务器的攻击&#xff0c;导致执行恶意查询。当 Web 应用程序使用未经适当验证的用户输入与数据库通信时&#xff0c;攻击者有可能窃取、删除或更改私人和客户数据&#xff0c;还可以攻击 Web 应用程…

LeetCode每日一题 | 2808. 使循环数组所有元素相等的最少秒数

文章目录 题目描述问题分析程序代码 题目描述 原题链接 给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在[0, n - 1]内的每一个下标i&#xff0c;将nums[i]替换成nums[i]&#xff0c;nums[(i - 1 n) % n]或…

自定义vue通用左侧菜单组件(未完善版本)

使用到的技术&#xff1a; vue3、pinia、view-ui-plus 实现的功能&#xff1a; 传入一个菜单数组数据&#xff0c;自动生成一个左侧菜单栏。菜单栏可以添加、删除、展开、重命名&#xff0c;拖动插入位置等。 效果预览&#xff1a; 代码&#xff1a; c-menu-wrap.vue <t…

docker swarm转移K8s 实践(-)

相关资料 Kubernetes初识_kubernetes怎么读-CSDN博客

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求&#xff1a; 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc…

鸿蒙OS之Rust开发

背景 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C/C 代码和提升编译速度&#xff0c;使用了GN Ninja的编译构建系统。GN的构…

Open CASCADE学习|遍历曲面的边

目录 1、球面的Brep数据 2、C遍历球面的边 ​这里以球面为例来说明如何遍历曲面的边。 1、球面的Brep数据 使用Tcl命令在Draw Test Harness中生成的球面并到出Brep数据如下&#xff1a; pload ALL psphere asphere 1 dump asphere 结果如下&#xff1a; *********** D…

构建高效外卖系统:利用Spring Boot框架实现

在当今快节奏的生活中&#xff0c;外卖系统已经成为人们生活中不可或缺的一部分。为了构建一个高效、可靠的外卖系统&#xff0c;我们可以利用Spring Boot框架来实现。本文将介绍如何利用Spring Boot框架构建一个简单但功能完善的外卖系统&#xff0c;并提供相关的技术代码示例…

C++ std::thread 的基本使用方法Linux强制结束进程

std::thread 是 C11 中的一个多线程库&#xff0c;用于创建和管理线程。使用 std::thread&#xff0c;可以将一个函数或可调用对象作为参数&#xff0c;创建一个新的线程来运行该函数或对象。 下面是 std::thread 的基本用法&#xff1a; 包含头文件#include < thread >…