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的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代分布式系统中,消息队列的作用愈发重要࿰…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
