当前位置: 首页 > 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…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...