当前位置: 首页 > news >正文

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
  1. 读入 Header line@
  2. 执行N命令,将 \n@将加入到**Header line@**中。当前数据为 Header line@\n@
  3. 执行 s 命令,将 **@\n@**替换成空。当前数据为 Header line
  4. 打印Header line
  5. 删除模式空间中的第一行(Header line),继续执行N命令。

D命令的强大之处在于,删除模式空间的第一行后会强制sed编辑器返回到脚本的起始处。

二、保留空间

模式空间:是一块活跃的缓存区,在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
  1. 找到包含 header的行 header line
  2. h将模式空间复制到保留空间,现在模式空间和保留空间内容一样(header line
  3. p打印模式空间内容
  4. n 移到下一行数据 data line 1,现在模式空间是 data line 1,保留空间是 header line*
  5. p 打印 模式空间内容
  6. g 将保留空间复制到模式空间,现在模式空间和保留空间内容一样(header line
  7. 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. 1!G :从第二行开始,将保留空间的内容追加到模式空间。
  2. h :将模式空间的内容复制到保留空间
  3. $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 编辑器的基础命令都是对一行文本进行操作。如果要处理的数据分布在多行中&#xff0c;sed基础命令是没办法处理的。 幸运的是&#xff0c;sed编辑器的设计人员已经考虑了这个问题的解决方案。sed编辑器提供了3个处理多行文本的特殊命令。 命令描述N加…...

【python】一篇文零基础到入门:快来玩吧~

本笔记材料源于&#xff1a; PyCharm | 创建你的第一个项目_哔哩哔哩_bilibili Python 语法及入门 &#xff08;超全超详细&#xff09; 专为Python零基础 一篇博客让你完全掌握Python语法-CSDN博客 0为什么安装python和pycharm&#xff1f; 不同于c&#xff0c;c&#xff0…...

Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞(六十六)

Python武器库开发-武器库篇之Thinkphp5 SQL注入漏洞&#xff08;六十六&#xff09; 漏洞环境搭建 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行ThinkPHP漏洞环境的安装&#xff0c;我们进入 ThinkPHP漏洞环境&#xff0c;可以 cd ThinkPHP&#xff0c;然后通过 …...

2024.6.28刷题记录

目录 一、13. 罗马数字转整数 贪心 二、16. 最接近的三数之和 排序指针 三、17. 电话号码的字母组合 dfs&#xff08;深度优先搜索&#xff09; 四、19. 删除链表的倒数第 N 个结点 1.模拟 2.前后同步指针 五、20. 有效的括号 栈 六、21. 合并两个有序链表 1.递归 …...

柔性数组(flexible array)

柔性数组从C99开始支持使用 1.柔性数组的概念 概念&#xff1a; 结构体中&#xff0c;结构体最后一个元素允许是未知大小的数组&#xff0c;这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点&#xff1a; 结构体中柔性…...

服务器配置路由

translator 在Linux系统中&#xff0c;通过ip route add命令添加的路由规则通常不会永久保存&#xff0c;它们只会在当前会话中生效。当系统重新启动后&#xff0c;这些临时添加的路由规则会丢失。 要求在开关机之后仍然保留这条路由&#xff0c;需要将路由规则永久保存。在大多…...

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩&#xff1f;举个例子你就彻底懂了&#xff01;&#xff01; 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下&#xff0c;你开了一家便利店&#xff0c;店里…...

[code snippet] 生成随机大文件

[code snippet] 生成随机大文件 一个无聊的测试代码&#xff0c;因为要测试大文件的网络传输&#xff0c;就写了一个随机大文件生成脚本&#xff0c;做个备份。 基本上都是 GPT 生成的&#xff0c;哈哈。 C# 代码 namespace ConsolePlayground;internal class BigFileGenera…...

计算机网路面试HTTP篇三

HTTPS RSA 握手解析 我前面讲&#xff0c;简单给大家介绍了的 HTTPS 握手过程&#xff0c;但是还不够细&#xff01; 只讲了比较基础的部分&#xff0c;所以这次我们再来深入一下 HTTPS&#xff0c;用实战抓包的方式&#xff0c;带大家再来窥探一次 HTTPS。 对于还不知道对称…...

如何不改变 PostgreSQL 列类型#PG培训

开发应用程序并在其背后操作数据库集群时&#xff0c;会遇到一个意想不到的问题是实践与理论、开发环境与生产之间的差异。这种不匹配的一个完美例子就是更改列类型。 #PG考试#postgresql培训#postgresql考试#postgresql认证 关于如何在 PostgreSQL&#xff08;以及其他符合 SQ…...

RocketMQ快速入门:事务消息原理及实现(十)

目录 0. 引言1. 原理2. 事务消息的实现2.1 java client实现&#xff08;适用于spring框架&#xff09;2.2 springboot实现 3. 总结 0. 引言 rocketmq 的一大特性就是支持事务性消息&#xff0c;这在诸多场景中有所应用。在之前的文章中我们已经讲解过事务消息的使用&#xff0…...

Kotlin设计模式:深入理解桥接模式

Kotlin设计模式&#xff1a;深入理解桥接模式 在软件开发中&#xff0c;随着系统需求的不断增长和变化&#xff0c;类的职责可能会变得越来越复杂&#xff0c;导致代码难以维护和扩展。桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过…...

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述 在现代的分布式系统和实时数据处理领域&#xff0c;消息中间件扮演着关键的角色&#xff0c;用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中&#xff0c;Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特…...

【UE5.3】笔记6-第一个简单小游戏

打砖块小游戏&#xff1a; 1、制造一面砖块组成的墙 在关卡中放置一个cube&#xff0c;放这地面上&#xff0c;将其转换成蓝图类,改名BP_Cube&#xff0c;更换砖块的贴图&#xff0c;按住alt键进行拷贝&#xff0c;堆出一面墙&#xff0c;复制出来的会很多&#xff0c;全选移动…...

LeetCode---402周赛

题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对&#xff0c;然后统计符合条件的下标对数目返回。代码如下 class So…...

循环冗余校验

循环冗余校验&#xff08;Cyclic Redundancy Check&#xff0c;简称CRC&#xff09;是一种广泛使用的错误检测编码技术&#xff0c;用于检测数据在传输或存储过程中是否发生错误。CRC通过在数据后面添加一个校验值&#xff08;通常称为CRC码或CRC校验和&#xff09;来实现错误检…...

resample sensor

resample sensor 的一个问题。 背景: 项目要求&#xff0c;发送多个数据到 sensor-hal 上去&#xff0c;发现无论怎样&#xff0c;在 sensor-hal 上都 只有一个数据。 resample sensor 是重新采样&#xff0c;这个怎么理解的&#xff0c;我的理解是&#xff1a; 假设 sensor 采…...

【Linux】多线程的相关知识点

一、线程安全 1.1 可重入 VS 线程安全 1.1.1 概念 线程安全&#xff1a;多个线程并发执行同一段代码时&#xff0c;不会出现不同的结果。常见对全局变量或者静态变量进行操作&#xff0c;并且没有锁的保护的情况下&#xff0c;会出现问题。重入&#xff1a;同一个函数被不同…...

Java反射详解

Java反射 一.什么是反射 我们使用的一些像框架&#xff0c;tomcat&#xff0c;或者一些其他的组件(jackson 对象–>json)。他们可以做到给他什么类名&#xff0c;就可以创建给定类的对象&#xff0c;并调用该对象的方法和属性。这是如何做到的&#xff1f; 当他们加载我们…...

Spring Boot与Apache Kafka集成的深度指南

Spring Boot与Apache Kafka集成的深度指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代分布式系统中&#xff0c;消息队列的作用愈发重要&#xff0…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...