Linux:文本三剑客之sed编辑器

news2024/11/25 16:51:49

Linux:sed编辑器

  • 一、sed
    • 1.1 sed编辑器
    • 1.2 sed编辑器的工作流程
    • 1.3 命令格式
    • 1.4常用选项
    • 1.5 常用操作
    • 1.6 实际应用

一、sed

1.1 sed编辑器

  • sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中

1.2 sed编辑器的工作流程

  • 1、读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

  • 2、执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址否则sed 命令 将会在所有的行上依次执行

  • 3、显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完

  • 注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出

1.3 命令格式

sed -e '操作' 文件1 文件2 ...      #-e后面跟操作,也可以根下面一样用大括号跟多个操作#
ed -e 'n{                      
操作1
操作2
...
}' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ... #sed命令默认会把执行的内容发到屏幕上,-n可省略,不加-n加p的话会把操作的行
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...

1.4常用选项

选项说明
-e 或 --expression=用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或 --file=用指定的脚本文件来处理输入的文本文件
-h 或 --help显示帮助
-n、--quiet 或 silent禁止sed编辑器输出,但可以与p命令一起使用完成输出
-i直接修改目标文本文件(先实验,确定没问题再用,并且备份源文件)

1.5 常用操作

选项说明
s替换,替换指定字符
d删除,删除选定的行
a增加,在当前行下面增加一行指定内容
i插入,在选定行上面插入一行指定内容
c替换,将选定行替换为指定内容
y字符转换打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用,转换前后的字符长度必须相同
=打印行号
l打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t、回车符\r

1.6 实际应用

  • 查询
sed -n '行号 p'      #打印指定行号的行#
sed -n '行1,行2 p'  #打印行1与行2区间的行#
sed -n '1,+n p‘     #打印行1与其之后连续n行#
sed -n ’/字符串/ p'  #打印包含字符串的行#
sed -n ‘/正则表达式/ p' #打印包含字符串的行#
  • 删除
sed '行号 d'               #删除指定行号的行#
sed '行1,行2 d'            #删除行1与行2区间的行#
sed '/字符串/ d'           #删除包含字符串的行#
sed '/正则表达式/ p'        #删除所有包含正则能够匹配的到内容的行#
sed '行号,/字符串/ d'       #删除从指定行到第一个包含字符串的行#
sed '/字符串1/,/字符串2/ d' #从第一个包含字符串1的行开始删除到从第一个包含字符串2的行,之后的行会重复之前的规则操作#
  • 替换
sed 's/旧字符串/新字符串/'             #替换匹配行的第一个对应的字符串#
sed 's/旧字符串/新字符串/2'            #替换匹配行的第二个对应的字符串#
seds '/旧字符串/新字符串/g'            #替换匹配行的所有对应的字符串#
seds '/旧字符串/新字符串/gw file'      #把替换后的行内容保存到指定文件#
sed -n 's/旧字符串/新字符串/gp’ > file #同上#
sed '行号 s/旧字符串/新字符串/g'        #替换指定行的对应的字符串#
sed '行1,行2 s/旧字符串/新字符串/g'     #替换行1与行2区间的匹配行的对应的字符串#
sed '/字符串/ s/旧字符串/新字符串/g'    #替换带有字符串的行,把旧字符全换成新字符#
sed '/正则表达式/ s/旧字符串/新字符串/g' #替换满足匹配条件的行,把旧字符全换成新字符#
s/xx/XX/                             #后面的替换分隔符可以使用其他字符代替,需要确保三个分隔字符保持一致#
例子:s?xx?XX?                        #像/bin/bash/这种换成其他字符,就需要再斜杠前面加反斜杠,那个时候会看的很累,所以可以用别的字符来代替,例如’?‘之类#
sed '行号c XXXX'                      #替换指定行的整行内容#
sed 'y/abc/123/'                     #替换所有相对应的字符#
sed 's/.*字符串.*/#&/'                #'&'代表前面匹配到结果的行,在前面加个’#‘#
  • 插入
sed '行号a xxxx'                                  #在指定行下面插入内容#
    '/字符串/a xxxx'
sed '行号i xxxx'                                  #在指定行上面插入内容#
    '/字符串/i xxxx'
sed '行号r file'                                  #在指定行下面读取文件内容#
sed '/root/(H;d);$G' /etc/passwd                  #将包含root的行剪切到末尾,H表示复制到剪切板,G表示粘贴到指定行后,没有d的话,有复制粘贴的意思,有d的话,是剪切粘贴的意思#
sed '1,3H;5,7G‘  /etc/passwd                      #将1到3行的内容复制到5到7行下面#
echo ”111222333“ | sed -r 's/(111)(222)/\2\1/'    #将字符 111 和 222 互换位置#
echo "111222333" | sed -r 's^(.)(.*)(.)$/\3\2\1/' #将第一个字符和最后一个字符互换#
  • 例子
sed -n -e '=' -e 'p' b.txt #只执行一个操作的情况下-e加不加效果一样#
one
two
...

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

cat b.txt | sed -n '=;p' #多个命令之间可以用’;‘来进行分割#
1
one
2
two
...

在这里插入图片描述

在这里插入图片描述

cat a.txt | sed -n '3p' #’p'前面加数字,表示打印指定行的内容#
100
cat a.txt | sed -n '$p' #‘$p'表示最后一行的内容#
777
cat a.txt | sed -n '8,$p' #第八行到最后一行的内容,用’,‘分割#
333
34
...
cat a.txt | sed -n '8p;$p' #只显示第八行和最后一行的内容,用’;‘表示前一个结束#
333
777
cat a.txt | sed -n '8,+3p' #显示第八行以及它后面连续的3行#
333
34
333
444
cat a.txt | sed '8q' #显示前8行然后退出#
1
10
100
...
3
333
cat b.txt | sed -n 'p;n' #只显示奇数行#
one
three
...
thirteen
cat b.txt | sed -n 'n;p' #只显示偶数行#
two
four
...
tweleve

在这里插入图片描述
在这里插入图片描述

cat b.txt "| sed -n '2,${n,p} #从第二行开始到结尾,执行先换行再打印的命令#
three
five
seven
nine
eleven
thirteen

在这里插入图片描述

sed -n '/^root/p' /etc/passwd        #过滤出以root开头的行#
sed -nr -e '/root|ftp/p' /etc/passwd #包含root或者ftp的行,因为‘|’是特殊符号,前面要么加-r,要么管道符前面加反斜杠#
sed -n '2,/ftp/' /etc/passwd         #从第二行开始到第一个带有ftp行结束#

在这里插入图片描述

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

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

相关文章

理解JVM

认识JVM Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。 什么是字节码? 字节码就是jvm能理解的代码。即扩展名为 .class 的文件。 我们日常的java文件先编译成.class 文件 然后在jvm上运行。 个人觉得 内存区域是理解JVM相关的基石。所以彻…

微服务简介,SpringCloud Alibaba Nacos的安装部署与使用,Nacos集成springboot

目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下: 1.2.分布式架构 分布式架构的优缺点: 1.3.微服务 微服务的架构特征: 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用 (一&…

【C++】深入剖析C++11新特性

目录 一、C11简介 二、统一的列表初始化 1.{}初始化 2.std::initializer_list 三、声明 1.auto 2.decltype 3.nullptr 四、范围for 五、final和oberride 六、STL中一些变化 1.array 2.forward_list 3.unordered_map和unordered_set 七、右…

RabbitMQ养成记 (2. java操作MQ快速入门,日志监控,消息追踪)

快速入门 刚开始我们就一步一步来, 先搞什么spring集成。 先使用原始的java代码来操作一下MQ。 这里给新手兄弟的建议,这种技术性的学习 一定要先动手,从简单的地方动手,一步一步来,不然上来就搞理论或者复杂的应用很…

JDBC API

注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); 所谓的注册驱动,就是让JDBC程序加载mysql驱动程序,并管理驱动 驱动程序实现了JDBC API定义的接口以及和数据库服务器交互的功能,加载驱动是为了方便使用这些功能。 获…

Spring IOC相关注解运用——下篇

目录 一、Configuration 二、ComponentScan 1. 说明 2. 测试方法 3. 运行结果 三、PropertySource 1. 说明 2. 测试方法 3. 测试结果 四、Bean 1. 说明 2. 添加驱动依赖 3. 将Connection对象放入Spring容器 3. 测试 五、Import 1. 说明 2. 测试方法 3. 运行结…

从一道go逆向出发,讨论类tea的逆算法

tea代码很短,经常被直接复制为源码(而不是像标准算法那样调库)。在ctf逆向中也算比较常见,复杂度适中。 例题是一道go逆向,经go parser处理后,核心代码如下图。 panic算是go的专有名词,类似异常…

吃透 Spring AOP (1.理解概念)

理解 什么是AOP AOP,全称面向切面编程。 它可以说是对面向对象OOP的思想升华。从总的理解来讲,AOP是横向对不同程序的抽象。这个思想要不断实践动手之后,才会有很深刻的理解 理解 代理模式 在理解AOP之前,我们首先要单独说一个…

FFMPEG录屏(16)--- MAG(Magnification)捕获桌面

最近增加了对Magnification API捕获桌面的支持,记录一下过程和其中遇到的问题。 参考资料 Magnification API overview Magnification API sample webrtc screen_capturer_win_magnifier.cc Structured Exception Handling (C/C) 前言 我又不得不吐槽一下了&a…

【JavaWeb】-- HTTP、Tomcat、Servlet

文章目录 HTTP1.简介2.请求数据格式2.2.1 格式介绍 3.响应数据格式3.1 格式介绍3.2 响应状态码 Tomcat1.简介1.1 什么是Web服务器 2.基本使用2.1 安装2.2 启动2.3 关闭 3.Maven创建Web项目4.IDEA使用Tomcat4.1集成本地Tomcat4.2 Tomcat Maven插件 Servlet1.简介2.快速入门3.执行…

okhttp篇3:RealCall

Call Call一般代表一个已经准备好的Request,Request的包装类,可执行,它一般有两个主要的方法: execute(立即执行,并阻塞线程,直到Response返回)enqueue(将Request放入队列,等待线程池调度执行…

spring源码学习_01 本地环境搭建

参考网上各种资源,终于把spring源码运行起来了;步骤总结如下: spring版本: 5.2.x 本地系统mac idea 2019.3.2 下载地址:https://www.jetbrains.com/idea/download/other.html jdk 11 下载地址:https://repo…

【设计模式二十三剑】✨编写更高质量代码的秘诀✨

文章目录 ✨✨简述🎆【万能之门】简单工厂模式(Simple Factory)🎇【制造之剑】工厂方法模式(Factory Method)🎇【生产之剑】抽象工厂模式(Abstract Factory)&#x1f387…

C语言基础知识:函数的调用

函数的定义 一般来说,执行源程序就是执行主函数main,其他函数只能被主函数所调用,而其他函数之间也可以相互调用。 1.标准库函数: 分为:I/O函数,字符串,字符处理函数,数学函数&am…

Go语言的函数和defer用法

目录 函数的基本用法 函数中的变长参数 递归函数(recursion) 函数是“一等公民” 函数中defer的用法 defer的底层原理 使用 defer 跟踪函数的执行过程 defer的注意事项 (1)Go语言内置的函数中哪些可以作为deferred 函数 (2&#xf…

面试code(1)—— 排序算法

算法动画 从小到大排序 1 冒泡排序 被动的将最大值送到最右边 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3、针对…

Redis修炼 (17. redis主从集群的数据同步原理 全量同步/增量同步)

数据同步 在一个集群之中 数据同步是很重要的。 redis的集群有多种。 我们这次主要说 主从集群。 全量同步 既然是主从集群 那么肯定是 1个master节点 多个从节点。redis的集群中的第一次同步 我们叫 全量同步: 为什么要强调第一次? 因为如果你是第一…

独家策略大放送:最高年化150%的策略,谁不感兴趣?(含免费版)

上一节我们在沪深300中回测了550中均线交叉策略,有朋友想看看这些策略在沪深300以外的中小市场表现如何,同时大家都非常好奇表现抢眼的老Q自研指标WMA_Q系列到底是怎么计算的。 于是老Q又选择了中证500和创业板指来验证下这些策略是否能有同样的表现(PART 1),顺便在今天的…

流水线中的握手信号笔记

1.《握手信号的打拍(一)》 解释了,为什么在流水线中,握手信号不能简单得加一级寄存器 业界关于流水线级握手信号的标准答案是 skid buffer,此外还有人提到了 Register slice 2.《握手信号的打拍(二)》 为什么简单加一级寄存器会握手失败 &…

抖音SEO系统源码开发搭建/MVC二次开发定制

首先,抖音SEO矩阵系统源码开发,如何做独立部署,首先我们需要深刻理解这个系统的开发逻辑是什么?开发的前言是在抖音平台做流量新增,现在抖音及各大主流短视频平台,流量新增,各大企业需要在短视频…