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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NPOI入门指南:轻松操作Excel文件的.NET库

目录 引言 一、NPOI概述 二、NPOI的主要用途 三、安装NPOI库 四、NPOI基本使用 六、性能优化和内存管理 七、常见问题与解决方案 八、结论 附录 引言 Excel文件作为数据处理的重要工具&#xff0c;广泛应用于各种场景。然而&#xff0c;在没有安装Microsoft Office的…

PySide(PyQt)在图像上画线

1、按鼠标左键任意画线 import sys from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PySide6.QtGui import QPainter, QPixmap, QMouseEvent, QColor, QPen from PySide6.QtCore import Qt, QPointclass PaintLabel(QLabel):def __init__(self…

本教程将指导如何通过 Vue 组件和后端 API 交互

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

Redis 集群模式

一、集群模式概述 Redis 中哨兵模式虽然提高了系统的可用性&#xff0c;但是真正存储数据的还是主节点和从节点&#xff0c;并且每个节点都存储了全量的数据&#xff0c;此时&#xff0c;如果数据量过大&#xff0c;接近或超出了 主节点 / 从节点机器的物理内存&#xff0c;就…

【Python系列】列表推导式:简洁而强大的数据操作工具

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

洛谷 P1548 [NOIP1997 普及组] 棋盘问题

题目 洛谷 P1548 [NOIP1997 普及组] 棋盘问题 [NOIP1997 普及组] 棋盘问题 题目背景 NOIP1997 普及组第一题 题目描述 设有一个 N M N \times M NM 方格的棋盘 ( 1 ≤ N ≤ 100 , 1 ≤ M ≤ 100 ) (1≤N≤100,1≤M≤100) (1≤N≤100,1≤M≤100) 求出该棋盘中包含有多少个正…

【Hadoop学习笔记】认识Hadoop

认识Hadoop 从网上找的课程做的笔记&#xff0c;有些图是自己理解画的&#xff0c;可能不正确&#xff0c;可以作为参考&#xff0c;有疑问的地方请直接指出&#xff0c;共同交流。 Hadoop是由Apache基金会开发的一个分布式系统基础架构&#xff0c;主要解决海量数据的存储和海…

不知道自己的优势擅长和兴趣爱好,我该如何填报高考志愿选专业?

天生我才必有用&#xff0c;每个人都是独立的个体&#xff0c;拥有自己的优势和擅长&#xff0c;当然这个优势和擅长&#xff0c;不是和别人对比&#xff0c;而是和自己对比产生的。 如果说你不知道自己的优势擅长&#xff0c;不知道自己的兴趣和爱好&#xff0c;那只不过是你没…

HarmonyOS APP应用开发项目- MCA助手(持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5 注&#xff1…

架构师篇-7、企业安全架构设计及实践

摘要&#xff1a; 认识企业安全架构企业安全案例分析及实践 内容&#xff1a; 为什么做企业安全架构怎么做好安全架构设计案例实践分析&随堂练 为什么要做企业安全架构 安全是麻烦制造者&#xff1f; 整天提安全需求增加开发工作增加运维要求增加不确定性延后业务上线…

【Docker】docker 替换宿主与容器的映射端口和文件路径

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 docker 替换宿主与容器的映射端口和文件夹 1. 正文 1.1 关闭docker 服务 systemctl stop docker1.2 找到容器的配置文件 cd /var/lib/docker/contain…

thymeleaf+mybatis(本文章用于期末考前10分钟速看)

期末速看 pom&#xff08;了解&#xff09;application.propertiessql代码Controller控制层视图service&#xff1a; 服务层mapper&#xff08;dao&#xff09;&#xff1a;持久层entity层(model层&#xff0c;domain层、 bean)&#xff1a;对应数据库表&#xff0c;实体类 效果…

BIM 模型三维展示方式

三维模型展示场景目前主流的使用 threejs ,bably.js 引擎框架作为开发展示&#xff1b;对于特殊的封闭式模型格式需要二次转换处理&#xff1b;今天推荐一款直接将模型碎片化处理方式&#xff0c;同时能够在网页加载速度快&#xff0c;性能也很流畅&#xff0c;先看结果&#x…

llama3模型部署时遇到的问题及解决方案

在llama3模型部署时&#xff0c;会遇到一系列问题&#xff0c;这里就作者所遇到的问题与解决方法分享一下。 注意&#xff1a;这里是从llama3 github主页上给的方法一步步做的&#xff0c;不适用于其他部署大模型的方法。 文章目录 ERROR 403&#xff1a;Forbidden安装依赖时出…

【Python游戏】猫和老鼠

本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、代码示例三、知识点梳理四、总结一、前言 本文介绍如何使用Python的海龟画图工具turtle,开发猫和老鼠游戏。 什么是Python? Python是由荷兰人吉多范…

后端之路第三站(Mybatis)——结合案例讲Mybatis怎么操作sql

先讲一下准备工作整体流程要做什么 我们要基于一个员工管理系统作为案例&#xff0c;进行员工信息的【增、删、改、查】 原理就是用Mybatis通过java语言来执行sql语句&#xff0c;来达到【增、删、改、查】 一、准备工作 1、引入数据库数据 首先我们把一个员工、部门表的数…

简述设计模式-工厂模式

概述 工厂模式是为了提供创建对象的方式&#xff0c;无需制定要创建的具体类。 举个例子&#xff0c;假如我是甲方需要制造一辆车&#xff0c;我可以要油车&#xff0c;可以要电车&#xff0c;也可以油电混动车&#xff0c;如果没有工厂&#xff0c;我需要自己找到对应的制造…

机电公司管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;管理员管理&#xff0c;客户管理&#xff0c;公告管理&#xff0c;考勤管理&#xff0c;请假管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;机电零件…

【单片机毕业设计11-基于stm32c8t6的智能水质检测】

【单片机毕业设计11-基于stm32c8t6的智能水质检测】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇11基于stm32的智能水质检测系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖可私 一、功能介绍 -------------…

独家原创 | Matlab实现CNN-Transformer多变量时间序列预测

SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-Transformer多变量时间序列预测&#xff1b; 2.运行环境为Matlab2023b…