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 line

data line 1

End 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 1

End 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 line

 sed  -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/bash

var=$(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 line

data line 1

End of data line
7.2 对可能有空行的文件加倍行间距
$ cat <data1
header line
data line 1



End of data line

ubuntu@VM-8-14-ubuntu:~$ sed -n '{/^$/d;$!G;p}' data1
header line

data line 1

End 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据学习之分布式数据采集系统Flume学习

分布式数据采集系统Flume学习 一、Flume架构 1.1 Hadoop业务开发流程 1.2 Flume概述 flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。 支持在日志系统中定制各类数据发送方&#xff0c;用于收集数据; 同时&#xff0c;Flume提供对数据进行简单处理&…

如何在720漫游中设置付费观看?

1. 进入720漫游作品编辑器&#xff0c;点击 「全局设置-营销设置-付费观看设置」 即可打开付费观看设置栏&#xff1b; 720漫游编辑器-全局设置 2. 开启付费观看功能后&#xff0c;设置「付费金额」&#xff0c;选择「付费场景」即可 720漫游编辑器-全局设置-付费观看设置 3.…

CentOS 生命周期结束指南

2019 年 9 月&#xff0c;Red Hat 宣布打算废止 CentOS&#xff0c;并将其替换为 CentOS Stream。 CentOS 7 和 8 是 CentOS Linux 的最终版本。CentOS 7 和 8 的生命周期结束日期为&#xff1a; CentOS 8 - 2021 年 12 月 31 日 CentOS 7 - 2024 年 6 月 30 日 相关内容推荐 点…

【人工智能学习之图像操作(三)】

【人工智能学习之图像操作&#xff08;三&#xff09;】 图像滤波滤波概念卷积平滑算子均值滤波高斯滤波中值滤波双边滤波锐化算子USM锐化梯度算子 傅里叶变换直方图直方图直方图均衡化自适应均衡化2D 直方图直方图反向投影 图像滤波 滤波概念 滤波过程就是把不需要的信号频率…

【D3.js in Action 3 精译】1.1.2 D3.js 的适用场景

译注 上一节中我们了解了 D3 诞生的技术背景——为了满足 Web 可访问数据的可视化需求。本节再来看看 D3.js 的适用场景是怎样的、在什么时候会考虑使用 D3.js。 1.1.2 D3.js 的适用场景 数据可视化领域正蓬勃发展&#xff0c;且备受青睐。过去十年间用于生成数据驱动图形的工…

Vite脚手架+Vant组件库初始化前端项目

脚手架概念&#xff1a; 在前端开发中&#xff0c;脚手架&#xff08;Scaffold&#xff09;是指一个用于快速搭建项目基础结构的工具或模板。脚手架包含了项目所需的基本文件结构、配置文件、依赖管理等内容&#xff0c;使开发者能够更快速地开始项目开发&#xff0c;而不必从…

H-K算法介绍与MATLAB实现

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在AI学习笔记&#…

sql想查询一个数据放在第一个位置

sql想查询一个数据放在第一个位置 背景:比如在查询后台账号的时候想将管理员账号始终放在第一个,其他账号按照创建时间倒序排序, 可以这样写sql: SELECTid,create_time FROMuser ORDER BY CASEWHEN id 1 THEN1 ELSE 2 END ASC, create_time DESC 运行截图: 可以看到id…

运算放大器输出相位反转和输入过压保护

运算放大器输出电压相位反转 本教程讨论两个与运算放大器相关的话题&#xff1a;输出相位反转和输入过压保护。 超过输入共模电压(CM)范围时&#xff0c;某些运算放大器会发生输出电压相位反转问题。其原因通常是运算放大器的一个内部级不再具有足够的偏置电压而关闭&#xff…

新火种AI|苹果要将苹果智能做成AI时代的APP Store?

作者&#xff1a;一号 编辑&#xff1a;美美 苹果还是想要自己做AI时代的“APP Store”。 自从去年开始落了队&#xff0c;苹果现在AI上开始高歌猛进。今年WWDC上展示的AI产品和与OpenAI的合作只是开始。有消息称&#xff0c;苹果正与Meta等AI巨头展开深入合作&#xff0c;这…

信息学奥赛初赛天天练-38-CSP-J2021阅读程序-约数个数、约数和、埃氏筛法、欧拉筛法筛素数应用

PDF文档公众号回复关键字:20240628 2021 CSP-J 阅读程序3 1阅读程序(判断题1.5分 选择题3分 共计40分 ) 01 #include<stdio.h> 02 using namespace std; 03 04 #define n 100000 05 #define N n1 06 07 int m; 08 int a[N],b[N],c[N],d[N]; 09 int f[N],g[N]; 10 11 …

容器化spring boot应用程序

容器化spring boot应用程序有多种方式&#xff0c;如基于简单的Dockerfile&#xff0c;多阶段Dockerfile以及基于Docker Compose等&#xff0c;我们将逐步给大家介绍&#xff0c;本节主要介绍基于简单的Dockerfile进行容器化spring boot的应用程序。 创建Spring boot应用程序 …

日志可视化监控体系ElasticStack 8.X版本全链路实战

目录 一、SpringBoot3.X整合logback配置1.1 log4j、logback、self4j 之间关系 1.2 SpringBoot3.X整合logback配置 二、日志可视化分析ElasticStack 2.1为什么要有Elastic Stack 2.2 什么是Elastic Stack 三、ElasticSearch8.X源码部署 ​四、Kibana源码部署 五、LogSta…

【计算机系统结构】复习重点(计算机系统结构(第3版)张晨曦 王志英等)

注意 导入过来排版不太对&#xff0c;建议看我的语雀文档 https://www.yuque.com/tongyan-qsj3t/zwlq23/dobnlmaa9knfxfsv?singleDoc# 《【计算机系统结构】复习重点&#xff08;计算机系统结构&#xff08;第3版&#xff09;张晨曦 王志英等&#xff09;》 教材版本 计算机…

Element-UI 并排显示多个 disabled按钮的时候, 不生效问题解决

目录 Element-UI 并排显示多个 disabled按钮的时候&#xff0c; 不生效问题解决 解决方法&#xff1a; 运行结果&#xff1a; Element-UI 并排显示多个 disabled按钮的时候&#xff0c; 不生效问题解决 解决方法&#xff1a; Element-UI 并排显示多个 disabled按钮的时候&a…

摄影楼电子相册打开的正确方式,快来看看

​随着科技的不断发展&#xff0c;电子相册已经成为许多人存储和分享照片的重要方式。然而&#xff0c;你知道如何正确打开电子相册吗&#xff1f;今天&#xff0c;我就来教大家一下电子相册的正确打开方式&#xff0c;快来学习一下吧&#xff01; 第一步&#xff1a;选择合适的…

【离散数学·图论】(复习)

一、基本概念 1.一些基本术语&#xff1a; 2.点u&#xff0c;v邻接&#xff08;或相邻&#xff09;: 边e称为关联顶点u和v,or e连接u和v; 3.G(V,E)中&#xff0c;顶点v所有邻居的集合&#xff1a;N(v), 成为v的邻域。 4.度 &#xff1a; deg(v) 5.悬挂点&#xff1a;度为1的…

智慧园区大数据云平台建设方案(Word原件)

第一章 项目建设背景及现状 第二章 园区创新发展趋势 第三章 工业园区大数据存在的问题 第四章 智慧工业园区大数据建设目的 第五章 智慧园区总体构架 第六章 系统核心组件 第七章 智慧工业园区大数据平台规划设计 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单…

为什么不再推荐使用 VRTK 4?

引言 VRTK (Virtual Reality Toolkit) 发布于2016年&#xff0c;初期受到了广大开发者的欢迎并被广泛采用。但是随着 VR 开发生态的发展&#xff0c;这款工具逐渐失去了最初的光芒。本文试图通过几个维度的分析&#xff0c;解释为什么目前不推荐使用 VRTK 进行开发的理由&…

高电压技术-冲击高压发生器MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 冲击电压发生器是产生冲击电压波的装置&#xff0c;用于检验电力设备耐受大气过电压和操作过电压的绝缘性能&#xff0c;冲击电压发生器能产生标准雷电冲击电压波形&#xff0c;雷电冲击电压截波,标准操作冲击…