SHELL脚本学习(十二)sed进阶

news2024/12/24 8:15:23

一、多行命令

概述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提高LabVIEW程序可靠性

​提高LabVIEW程序的可靠性是确保系统稳定运行、减少故障和维护成本的重要措施。以下从多个方面详细分析如何提高LabVIEW程序的可靠性 1. 选择合适的架构 1.1 状态机架构 适用情况&#xff1a; 多状态、多步骤操作。 具体例子&#xff1a;在一个自动测试系统中&#xff0c;…

我在高职教STM32——时钟系统与延时控制(1)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

44.商城系统(二十五):k8s基本操作,ingress域名访问,kubeSphere可视化安装

上一章我们已经配置好了k8s集群,如果没有配置好先去照着上面的配。 一、k8s入门操作 1.部署一个tomcat,测试容灾恢复 #在主机器上执行 kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8#查看k8s中的所有资源 kubectl get all kubectl get all -o wide#查看po…

VsCode:配置TypeScript开发环境

一、前提 电脑已经安装了npm 何如安装npm&#xff0c;请点击查看Node.js、npm常用命令、安装多个node版本 提醒&#xff1a;下文讲解操作是在mac 系统进行的&#xff0c;TypeScript简称&#xff1a;ts 二、安装TypeScript 在终端里执行命令&#xff1a;npm install -g typescr…

LLM大模型实战 —— DB-GPT阿里云部署指南

简介&#xff1a; DB-GPT 是一个实验性的开源应用&#xff0c;它基于FastChat&#xff0c;并使用vicuna-13b作为基础模型, 模型与数据全部本地化部署, 绝对保障数据的隐私安全。 同时此GPT项目可以直接本地部署连接到私有数据库, 进行私有数据处理&#xff0c; 目前已支持SQL生…

Swift 6:导入语句上的访问级别

文章目录 前言示例启用 AccessLevelOnImport破坏性变更采用这些更改总结前言 SE-0409 提案引入了一项新功能,即允许使用 Swift 的任何可用访问级别标记导入声明,以限制导入的符号可以在哪些类型或接口中使用。由于这些变化,现在可以将依赖项标记为对当前源文件(private 或…

数据分析三剑客-Matplotlib

数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中&#xff0c;三个非常重要的工具和库&#xff1a;Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析&#xff0c;NumPy专注于数值计算和数学运算&#xff0c;而Matplotlib则负责数据可视化。这三个库相…

友力科技广州数据中心搬迁

搬迁工作内容 1.搬迁技术工作 1)确定机房搬迁的负责人以及负责人的联系方式&#xff0c;保证在搬迁的过程中统一指挥管理。 2)确定服务器的数量&#xff0c;服务器的型号&#xff0c;服务器的配置等&#xff0c;如有需要&#xff0c;联系相关服务器的供货商或者厂家提供技术支持…

HBuilder X 小白日记01

1.创建项目 2.右击项目&#xff0c;可创建html文件 3.保存CtrlS&#xff0c;运行一下 我们写的内容&#xff0c;一般是写在body里面 注释的快捷键&#xff1a;Ctrl/ h标签 <h1> 定义重要等级最高的(最大)的标题。<h6> 定义最小的标题。 H标签起侧重、强调的作用…

Pinia详解

文章目录 简介特点用法1. 安装Pinia2. 注册Pinia Store3. 创建Pinia Store4. 使用Pinia Store 区别 Vuex详解 Pinia是一个基于Vue 3的状态管理库&#xff0c;专为Vue 3设计。它提供了一种简单、直观且可扩展的方式来组织和访问应用程序的状态。Pinia的设计灵感来源于Vuex&#…

数据资产管理的艺术:构建智能化、精细化的数据资产管理体系,从数据整合、分析到决策支持,为企业提供一站式的数据资产解决方案,助力企业把握数字时代的新机遇

一、引言 在数字化浪潮席卷全球的今天&#xff0c;数据已经成为企业最重要的资产之一。如何高效、安全地管理这些海量数据&#xff0c;从中提取有价值的信息&#xff0c;并将其转化为决策支持&#xff0c;是每个企业都必须面对的挑战。本文将探讨数据资产管理的艺术&#xff0…

中国高分辨率土壤质地数据(1KM)

土壤中各粒级占土壤重量的百分比组合&#xff0c;叫做土壤质地。土壤质地是土壤的最基本物理性质之一&#xff0c;对土壤的各种性状&#xff0c;如土壤的通透性、保蓄性、耕性以及养分含量等都有很大的影响是评价土壤肥力和作物适宜性的重要依据。 中国土壤质地空间分布数据是根…

ChatTTS超真实自然的语音合成模型

项目介绍 ChatTTS是一款专为优化对话场景而生的语音生成模型&#xff0c;尤其匹配大型语言模型&#xff08;LLM&#xff09;的交互需求&#xff0c;以及生成对话式音频、视频旁白等应用场景&#xff0c;无缝覆盖中英文双语。 通过汲取约100,000小时的高质量中英语音数据进行深…

全球首个真人级数字人,开源了!

全球首个2D真人级AIGC**实时渲染数字人模型开源了&#xff01; 这是数字人技术界的一次大爆炸&#xff0c;我们即将迈入一个全新的交互时代&#xff0c;一个由数字人代理引领的时代。 DUIX&#xff08;Dialogue User Interface System&#xff09;&#xff0c;这个由硅基智能…

Unity的Excel转表工具

该Excel工具主要由Python语言完成&#xff0c;版本为3.x 主要功能&#xff1a; 1.转换后的数据存储结构为二进制。 2.excel文件可以选择多种数据类型&#xff1a;int、float、string、一维&#xff08;int、float、string&#xff09;、二维int、Map&#xff08;int/int、in…

杂谈咋说-事业编与公务员建议收藏!

杂谈咋说-事业编与公务员建议收藏&#xff01; 什么是铁饭碗 在中国&#xff0c;「铁饭碗」这个词常常被用来形容那些稳定、有保障的工作。 当我们谈论"铁饭碗"时&#xff0c;人们往往会将公务员和事业编制人员进行比较。 尽管这两者都是相对稳定的工作&#xff…

从单一到多元:EasyCVR流媒体视频汇聚技术推动安防监控智能升级

随着科技的飞速发展&#xff0c;视频已成为我们日常生活和工作中的重要组成部分。尤其在远程办公、在线教育、虚拟会议等领域&#xff0c;视频的应用愈发广泛。为了满足日益增长的视频需求&#xff0c;流媒体视频汇聚融合技术应运而生&#xff0c;它不仅改变了传统视频的观看和…

已解决javax.transaction.InvalidTransactionException:事务无效的正确解决方法,亲测有效!!!

已解决javax.transaction.InvalidTransactionException&#xff1a;事务无效的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 1. 确保事务的正确启动和结束 Spring中的事务管理 2. 避免嵌套事务问题…

第五节:如何使用其他注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上节我们实践了通过Bean方式声明Bean配置。咱们这节通过Component和ComponentScan方式实现一个同样功能。这节实现的效果是从IOC中加载Bean对象&#xff0c;并且将Bean的属性打印到控制台。 第一步&#xff1a;创建pojo实体类studen…

SpringBoot——整合Shiro,实现安全认证和权限管理功能

目录 Shiro 项目总结 新建一个SpringBoot项目 pom.xml application.properties&#xff08;配置文件&#xff09; User&#xff08;实体类&#xff09; UserMapper&#xff08;数据访问层接口&#xff09; UserMapper.xml&#xff08;数据库映射文件&#xff09; User…