SHELL脚本学习(十二)sed进阶
一、多行命令
概述
sed 编辑器的基础命令都是对一行文本进行操作。如果要处理的数据分布在多行中,sed基础命令是没办法处理的。
幸运的是,sed编辑器的设计人员已经考虑了这个问题的解决方案。sed编辑器提供了3个处理多行文本的特殊命令。
命令 | 描述 |
---|---|
N | 加入数据流的下一行,创建一个多行组进行处理 |
D | 删除多行组中的一行 |
P | 打印多行组中的一行 |
1.1 next命令
使用多行next(N)命令前先看一下单行next(n)是如果工作的。
1.1.1 单行next(n)命令
默认情况下,sed编辑器是从数据流中读出一行数据,然后用命令列表中的命令依次处理这一行数据。所有命令执行完后,取下一行数据重复上述过程。
单行next命令告诉sed编辑器跳过当前行,直接移动到数据流的下一行,并且只执行 单行next命令之后的命令。
例:删除首行之后的空行
$ cat < data1
header linedata line 1End of data line### 不使用next命令会将所有的空行都删除
$ sed '/^$/d' data1
header line
data line 1
End of data line$ sed '/header/{n;d}' data1
header line
data line 1End of data line
1.1.2 多行next(N)命令
多行next(N)命令会将下一行数据追加到正在处理数据(模式空间)中,文本仍然以换行符分隔。
$ cat <data1
header line
data line 1
End of data line$ sed '/header/{N;s/\n//}' data1
header linedata line 1
End of data line
这个例子中,sed先查找包含header 的行 “header line”,然后将下一行 “data line 1” 追加到当前数据中,再删除换行符。
处理分散在两行中的短语时,使用N命令非常方便。
$ cat < data2
The linux System
Admin group metting will be held.$ sed -n '/System.Admin/p' data2
$ sed -n '{N;/System.Admin/p}' data2
The linux System
Admin group metting will be held.
1.2 多行删除命令(D)
多行删除命令(D),删除多行数据的第一行。
$ cat <data2
The linux System
Admin group metting will be held.#d命令将两行全部删除了
$ sed '{N;/System.Admin/d}' data2#D命令只删除了第一行
ubuntu@VM-8-14-ubuntu:~$ sed '{N;/System.Admin/D}' data2
Admin group metting will be held.
1.3 多行打印命令( P)
与D命令相似。P命令只打印多行数据中的一行。
#p命令将两行全部打印出来
$ sed -n '{N;/System.Admin/p}' data2
The linux System
Admin group metting will be held.#P命令只打印一行
$ sed -n '{N;/System.Admin/P}' data2
The linux System
P命令的强大之处体现在与N命令和D命令配合使用的时候。
$ cat <data3
Header line@
@
data line #1
data line #2@
@
End of data line$ sed -n '{N;s/@\n@//;P;D}' data3
Header line
data line #1
data line #2
End of data line
- 读入 Header line@
- 执行N命令,将 \n@将加入到**Header line@**中。当前数据为 Header line@\n@
- 执行 s 命令,将 **@\n@**替换成空。当前数据为 Header line
- 打印Header line
- 删除模式空间中的第一行(Header line),继续执行N命令。
D命令的强大之处在于,删除模式空间的第一行后会强制sed编辑器返回到脚本的起始处。
二、保留空间
模式空间:是一块活跃的缓存区,在sed 编辑器 执行命令时保存待检查的文本。
sed 编辑器还有另外一块缓存区 保留空间。当你在处理模式空间中的某些数据时,可以将数据暂时存在保留空间。
命令 | 描述 |
---|---|
h | 将模式空间复制到保留空间 |
H | 将模式空间追加到保留空间 |
g | 将保留空间复制到模式空间 |
G | 将保留空间追加到模式空间 |
x | 交换模式空间和保留空间的内容 |
$ cat <data1
header line
data line 1
End of data line$ sed -n '/header/{h;p;n;p;g;p}' data1
header line
data line 1
header line
- 找到包含 header的行 header line
- h将模式空间复制到保留空间,现在模式空间和保留空间内容一样(header line)
- p打印模式空间内容
- n 移到下一行数据 data line 1,现在模式空间是 data line 1,保留空间是 header line*
- p 打印 模式空间内容
- g 将保留空间复制到模式空间,现在模式空间和保留空间内容一样(header line)
- p 打印模式空间内容
三、 排除命令
感叹号 ! 命令用于排除命令,也就是让原来的命令失效
$ cat < data1
header line
data line 1
End of data line$ sed -n '/header/p' data1
header line$ sed -n '/header/!p' data1
data line 1
End of data line
正常情况下, p打印包含header的行。
使用排除命令后,!p打印不包含header的行。
例:倒序输出文件内容
$ cat <data1
header line
data line 1
End of data linesed -n '{1!G;h;$p}' data1
End of data line
data line 1
header line
- 1!G :从第二行开始,将保留空间的内容追加到模式空间。
- h :将模式空间的内容复制到保留空间
- $p :处理到最后一行时 打印模式空间内容。
四、 改变执行流程
通常sed会从第一条命令开始执行,一直执行到最后一条命令。
sed 编辑器 提供了一种可以改变命令执行顺序的方法。
4.1 分支
分支命令(b)格式
[address] b [blabel]
address 决定了那些行会触发分支命令。
label 决定了跳转到的位置
$ cat <data1
header line
data line 1
End of data line#跳过前两行
$ sed -n '{1,2b;p}' data1
End of data line
$ cat < data1
header line
data line 1
End of data line#如果匹配data line 1,则跳到:jump处执行。否则顺序执行。sed '{/data line 1/b jump
s/data/replacement/;
:jump
s/data/replacement jump/}' data1
header line
replacement jump line 1
End of replacement line
去掉文本中的逗号
$ echo "1,2,3,4,5"| sed -n '{:begin s/,//; /,/b begin;p}'
12345
4.2 测试
和分支命令(b)类似,测试命令(t)也可以修改sed编辑器命令的流程。
命令格式: [address] t label
和分支命令(b)类似。没有label的情况下,如果测试成功,sed会跳到脚本结尾。
去掉文本中的逗号
$ echo "1,2,3,4,5"| sed -n '{:begin s/,//p; t begin}'
12,3,4,5
123,4,5
1234,5
12345
五、模式替换
5.1 & 符号
& 符号代表替换命令中的匹配模式
$ echo "I have a cat,I have a hat"| sed -n 's/.at/"&"/gp'
I have a "cat",I have a "hat"
5.2 替换单独的单词
sed 编辑器使用圆括号定义替换模式的子模式。反向引用有反斜线和数字组成。
\1 是第一个子模式,\2是第二个子模式。依次类推。
圆括号需要用反斜线转义
$ echo "I have a cat,I have a hat"| sed -n 's/\(.at\)/"\1"/gp'
I have a "cat",I have a "hat"
六、 在脚本中使用 sed
6.1 使用包装器
将倒序输出文件内容命令封装成包装器。
$ cat <reserver.sh
#/usr/bin/bash
sed -n '{1!G;h;$p}' $1$ cat < data1
header line
data line 1
End of data line$ ./reserver.sh data1
End of data line
data line 1
header line
6.2 重定向sed 输出
使用 $() 将sed的输出重定向到变量中。
cat <reserver.sh
#/usr/bin/bashvar=$(sed -n '{1!G;h;$p}' $1)
echo result=$var$ ./reserver.sh data1
result=End of data line data line 1 header line
七、创建 sed 实用工具
7.1 加倍行间距
$ cat <data1
header line
data line 1
End of data line$ sed -n '{$!G;p}' data1
header linedata line 1End of data line
7.2 对可能有空行的文件加倍行间距
$ cat <data1
header line
data line 1End of data lineubuntu@VM-8-14-ubuntu:~$ sed -n '{/^$/d;$!G;p}' data1
header linedata line 1End of data line
7.3 给文件中的行编号
cat <data1
header line
data line 1
End of data line$ sed '=' data1|sed 'N;s/\n/\t/;'
1 header line
2 data line 1
3 End of data line
7.4 打印末尾行
打印文件后3行
$ cat<data3
line1
line2
line3
line4
line5
line6
line7
line8$ sed '{:begin $q;N;4,$D;b begin}' data3
line6
line7
line8
相关文章:
SHELL脚本学习(十二)sed进阶
一、多行命令 概述 sed 编辑器的基础命令都是对一行文本进行操作。如果要处理的数据分布在多行中,sed基础命令是没办法处理的。 幸运的是,sed编辑器的设计人员已经考虑了这个问题的解决方案。sed编辑器提供了3个处理多行文本的特殊命令。 命令描述N加…...
【python】一篇文零基础到入门:快来玩吧~
本笔记材料源于: PyCharm | 创建你的第一个项目_哔哩哔哩_bilibili Python 语法及入门 (超全超详细) 专为Python零基础 一篇博客让你完全掌握Python语法-CSDN博客 0为什么安装python和pycharm? 不同于c,c࿰…...
Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞(六十六)
Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞(六十六) 漏洞环境搭建 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装,我们进入 ThinkPHP漏洞环境,可以 cd ThinkPHP,然后通过 …...
2024.6.28刷题记录
目录 一、13. 罗马数字转整数 贪心 二、16. 最接近的三数之和 排序指针 三、17. 电话号码的字母组合 dfs(深度优先搜索) 四、19. 删除链表的倒数第 N 个结点 1.模拟 2.前后同步指针 五、20. 有效的括号 栈 六、21. 合并两个有序链表 1.递归 …...
柔性数组(flexible array)
柔性数组从C99开始支持使用 1.柔性数组的概念 概念: 结构体中,结构体最后一个元素允许是未知大小的数组,这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点: 结构体中柔性…...
服务器配置路由
translator 在Linux系统中,通过ip route add命令添加的路由规则通常不会永久保存,它们只会在当前会话中生效。当系统重新启动后,这些临时添加的路由规则会丢失。 要求在开关机之后仍然保留这条路由,需要将路由规则永久保存。在大多…...
老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!
老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!! 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下,你开了一家便利店,店里…...
[code snippet] 生成随机大文件
[code snippet] 生成随机大文件 一个无聊的测试代码,因为要测试大文件的网络传输,就写了一个随机大文件生成脚本,做个备份。 基本上都是 GPT 生成的,哈哈。 C# 代码 namespace ConsolePlayground;internal class BigFileGenera…...
计算机网路面试HTTP篇三
HTTPS RSA 握手解析 我前面讲,简单给大家介绍了的 HTTPS 握手过程,但是还不够细! 只讲了比较基础的部分,所以这次我们再来深入一下 HTTPS,用实战抓包的方式,带大家再来窥探一次 HTTPS。 对于还不知道对称…...
如何不改变 PostgreSQL 列类型#PG培训
开发应用程序并在其背后操作数据库集群时,会遇到一个意想不到的问题是实践与理论、开发环境与生产之间的差异。这种不匹配的一个完美例子就是更改列类型。 #PG考试#postgresql培训#postgresql考试#postgresql认证 关于如何在 PostgreSQL(以及其他符合 SQ…...
RocketMQ快速入门:事务消息原理及实现(十)
目录 0. 引言1. 原理2. 事务消息的实现2.1 java client实现(适用于spring框架)2.2 springboot实现 3. 总结 0. 引言 rocketmq 的一大特性就是支持事务性消息,这在诸多场景中有所应用。在之前的文章中我们已经讲解过事务消息的使用࿰…...
Kotlin设计模式:深入理解桥接模式
Kotlin设计模式:深入理解桥接模式 在软件开发中,随着系统需求的不断增长和变化,类的职责可能会变得越来越复杂,导致代码难以维护和扩展。桥接模式(Bridge Pattern)是一种结构型设计模式,它通过…...
常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解
1、概述 在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特…...
【UE5.3】笔记6-第一个简单小游戏
打砖块小游戏: 1、制造一面砖块组成的墙 在关卡中放置一个cube,放这地面上,将其转换成蓝图类,改名BP_Cube,更换砖块的贴图,按住alt键进行拷贝,堆出一面墙,复制出来的会很多,全选移动…...
LeetCode---402周赛
题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对,然后统计符合条件的下标对数目返回。代码如下 class So…...
循环冗余校验
循环冗余校验(Cyclic Redundancy Check,简称CRC)是一种广泛使用的错误检测编码技术,用于检测数据在传输或存储过程中是否发生错误。CRC通过在数据后面添加一个校验值(通常称为CRC码或CRC校验和)来实现错误检…...
resample sensor
resample sensor 的一个问题。 背景: 项目要求,发送多个数据到 sensor-hal 上去,发现无论怎样,在 sensor-hal 上都 只有一个数据。 resample sensor 是重新采样,这个怎么理解的,我的理解是: 假设 sensor 采…...
【Linux】多线程的相关知识点
一、线程安全 1.1 可重入 VS 线程安全 1.1.1 概念 线程安全:多个线程并发执行同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁的保护的情况下,会出现问题。重入:同一个函数被不同…...
Java反射详解
Java反射 一.什么是反射 我们使用的一些像框架,tomcat,或者一些其他的组件(jackson 对象–>json)。他们可以做到给他什么类名,就可以创建给定类的对象,并调用该对象的方法和属性。这是如何做到的? 当他们加载我们…...
Spring Boot与Apache Kafka集成的深度指南
Spring Boot与Apache Kafka集成的深度指南 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代分布式系统中,消息队列的作用愈发重要࿰…...
甄选版“论软件系统架构评估”,软考高级论文,系统架构设计师论文
论文真题 对于软件系统,尤其是大规模的复杂软件系统来说,软件的系统架构对于确保最终系统的质量具有十分重要的意义,不恰当的系统架构将给项目开发带来高昂的代价和难以避免的灾难。对一个系统架构进行评估,是为了:分析现有架构存在的潜在风险,检验设计中提出的质量需求,…...
uniapp开发企业微信内部应用
最近一直忙着开发项目,终于1.0版本开发完成,抽时间自己总结下在项目开发中遇到的技术点。此次项目属于自研产品,公司扩展业务,需要在企业微信中开发内部应用。因为工作中使用的是钉钉,很少使用企业微信,对于…...
0122__linux之eventfd理解
linux之eventfd理解-CSDN博客 Linux fd 系列 — eventfd 是什么?-CSDN博客...
数学建模 —— 查找数据
目录 百度搜索技巧 完全匹配搜索:查询词的外边加上双引号“ ” 标题必含关键词:查询词前加上intitle: 搜索文档:空格再输入filetype:文件格式 去掉不想要的:查询词后面加空格后加减号与关键字 知网查文献 先看知网的硕博士…...
合并有序链表
合并有序链表 图解代码如下 图解 虽然很复杂,但能够很好的理解怎么使用链表,以及对链表的指针类理解 代码如下 Node* merge_list_two_pointer(List& list1, List& list2) {Node* new_head1 list1.head;Node* new_head2 list2.head;Node* s…...
【SpringBoot Web框架实战教程】05 Spring Boot 使用 JdbcTemplate 操作数据库
不积跬步,无以至千里;不积小流,无以成江海。大家好,我是闲鹤,微信:xxh_1459,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了…...
Spark基于DPU的Native引擎算子卸载方案
1.背景介绍 Apache Spark(以下简称Spark)是一个开源的分布式计算框架,由UC Berkeley AMP Lab开发,可用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习&a…...
Mini2440 start.s 修改支持串口输出,方便调试 (四)
经常会遇到点板子的时候,板子没有任何反应!怎么知道板子有没有在正常启动,在uboot阶段 start.s 中加入串口打印信息是很有必要的! 输出串口信息 ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoo…...
【教程】几种不同的RBF神经网络
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…...
【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx
【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载: https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括…...
建网站的公司广州排名/企业培训系统app
nginx代理天地图做缓存解决跨域问题参考文章: (1)nginx代理天地图做缓存解决跨域问题 (2)https://www.cnblogs.com/zhang90030/p/9429649.html 备忘一下。...
如何登录网站备案/友情链接怎么购买
转自:http://blog.csdn.net/stormbjm/article/details/9086163 1、添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户#passwd tommy //修改密码 Changing password for user tom…...
构建网站的步骤/百度成都总部
InfluxDB 简介与安装 1、InfluxDB 简介 官网:https://www.influxdata.com/ 中文文档:https://jasper-zhang1.gitbooks.io/influxdb/content/ InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。 类似的数据库有…...
淮南市建设管理委员会网站/seo搜索优化工具
公司办公邮箱,一定要有企业邮箱!在与客户沟通过程中,往往合作的机会都在细节上,特别是外贸企业,因为国际邮件文化,老外都是用邮件沟通的,正规的公司邮箱可以为企业赢得更多的商机。TOM企业邮箱的…...
公众号模板编辑器/桂林网站优化
来自:知乎专栏,作者:Amis 链接:https://zhuanlan.zhihu.com/p/26497713 最近发现很多朋友在找工作的时候都屡屡碰壁,或是投了大把的简历都没回应,陷入于找工作的困境中,加上在过几个月就是传说中…...
有什么教做甜品的网站/广州信息流推广公司
2019独角兽企业重金招聘Python工程师标准>>> 江苏省钢铁行业联合重组正在酝酿中。重组目标设定为全省前4家钢铁企业占全省粗钢产能比例争取超过80%,前8家产能占比力争达到100%。这意味着,未来江苏省内的合规钢铁企业有望整合为8大企业集团&am…...