sed编辑器基础命令


shell脚本编程系列


学习sed编辑器

sed编辑器被称作流编辑器(stream editor),与普通的交互式文本编辑器不同,在交互式文本编辑器可以用键盘命令交互式插入、删除或替换文本数据。流编辑器则是根据事先设计好的一组规则编辑数据流。

sed编辑器主要操作

  • 从输入中读取一行数据
  • 根据所提供的编辑器命令匹配数据
  • 按照命令修改数据流中的数据
  • 将新的数据输出到STDOUT
  • 按顺序逐行按照以上步骤处理数据

sed命令的格式为

sed options script file

options参数允许修改sed命令的行为,比如

  • -n不产生输出,使用p(print)命令完成输出
  • -f file在处理输入时,将file中指定的命令添加到已有的命令中
  • -e commands则是在处理输入时,加入额外的sed命令。

script参数指定了应用于流数据中的单个命令,如果需要多个命令,则使用-e选项指定,也可以使用-f选项在单独的文件中指定。

在命令行中定义编辑器命令

echo "This is a test" | sed 's/test/big test/'

使用s替换命令,替换命令会用斜线间指定的第二个字符串替换第一个字符串,本例中,big test替换了test
在这里插入图片描述

sed 's/dog/cat/' data1.txt

读取文件,修改其中的内容,然后发送到STDOUT
在这里插入图片描述

在命令行中使用多个编辑器命令

sed -e 's/brown/red/;s/dog/cat/' data1.txt

两个命令都应用于文件的每一行数据。命令之间必须以分号分隔,并且在命令末尾和分号之间不能出现空格
在这里插入图片描述

如果不想再多个命令之间使用分号,也可以使用次提示符来分隔命令。必须在闭合单引号所在行结束命令,bash shell一旦发现了闭合单引号,就会执行命令

[root@192 Chapter19-Scripts]# sed -e '
> s/brown/green/
> s/fox/toad/
> s/dog/cat/' data1.txt

在这里插入图片描述

从文件中读取编辑器命令

sed -f script1.sed data1.txt

脚本中的内容为

s/brown/green/
s/fox/toad/
s/dog/cat/

在这种情况下,不用在每条命令后面加分号
在这里插入图片描述

sed编辑器基础命令

更多的替换选项

替换标志

在默认情况下,替换命令s只替换每行中出现的第一处匹配文本,要想替换所有的匹配文本,则必须使用替换标志(substitution flag)。替换标志在替换命令字符串之后设置,其格式为

s/pattern/replacement/flags

有4种可用的替代标志
数字:指明新文本将被替换行中的第几处匹配

  • g:替换行中所有的匹配
  • p:指明打印出替换后的行
  • w file:将替换后的结果写入文件
    替换每行中第二处匹配文本
sed 's/test/trial/2' data4.txt

在这里插入图片描述

替换文本行中所有的匹配文本

sed 's/test/trial/g' data4.txt

在这里插入图片描述

sed -n 's/test/trial/p' data5.txt

替换标志p会打印出包含替换命令中指定匹配模式的文本行,通常会和-n选项配合使用,-n选项会抑制sed编辑器的输出,而替换标志p会输出替换后的行。二者配合只会输出被替换命令修改过的行

sed -n 's/test/trial/w test.txt' data5.txt

在这里插入图片描述

替换标志w会将匹配的行输出保存到指定文件中。sed编辑器的正常输出会被保存在STDOUT中,只有那些包含匹配模式的行会被保存在指定的输出文件中。
在这里插入图片描述

替换字符

字符串中有一些不太方便在替代模式中使用的字符,比如正斜线(/),因为正斜线被用作替换命令的分隔符,因此它在匹配模式和替换文本中同时出现时,必须使用反斜线来转义。
比如

sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd

但是这样很容易造成混乱和错误,因此sed编辑器允许选择其他字符作为替换命令的替代分隔符

sed 's!/bin/bash!/bin/csh!' /etc/passwd

使用感叹号作为替换命令的分隔符
在这里插入图片描述

使用地址

在默认情况下,在sed编辑器中使用的命令会应用于所有的文本行,如果只想将命令应用于特定的某一行或某些行,则必须使用行寻址。
在sed命令中有两种形式的行寻址:

  • 以数字形式表示的行区间
  • 匹配行内文本的模式

以上两种形式使用相同的格式来指定地址

[address] command

也可以将针对特定地址的多个命令分组:

address{
   command1
   command2
   command3
}

sed编辑器会将指定的各个命令应用于匹配指定地址的文本行

  • 数字形式的行寻址

行地址既可以是单个行号

sed '2s/dog/cat/' data1.txt

也可以是用起始行号、逗号以及结尾行号指定的行区间

sed '2,3s/dog/cat/' data1.txt

美元符号作为结尾行号

sed '2,$s/dog/cat/' data1.txt

在这里插入图片描述

  • 使用文本模式过滤
/pattern/command

必须将指定的模式(pattern)放在正斜线内
比如只想修改test用户的默认shell

sed '/test/s/bash/csh/' /etc/passwd

上面的案例使用固定的文本模式过滤特定的值,但有局限,sed编辑器也支持在文本模式中使用正则表达式来创建匹配效果更好的模式
在这里插入图片描述

  • 使用组的方式替换文本
[root@192 Chapter19-Scripts]# sed '2{
> s/fox/toad/
> s/dog/cat/
> }' data1.txt

在这里插入图片描述

删除行

删除命令(d)会删除匹配指定模式的所有行。使用时需要小心,如果没有指定寻址方式,则流中的所有文本都会被删除。

 sed 'd' data1.txt
  • 通过行号指定要删除的行
    在这里插入图片描述
  • 通过特定行区间指定
sed '2,3d' data6.txt

在这里插入图片描述

  • 通过特殊的末位字符$指定位置
sed '3,$d' data6.txt

在这里插入图片描述

sed编辑器的模式匹配特性也适用于删除命令

sed '/number 1/d' data6.txt

在这里插入图片描述

也可以使用两个文本模式来删除匹配区间的行,但是要注意,第一个模式启动行删除功能,而第二个模式关闭行删除功能,如果匹配了第一个模式之后,剩余文本中没有匹配第二个模式的,则从匹配了第一个模式的行之后,都会被删除
在这里插入图片描述

插入和附加文本

sed '[address]command new line'

插入(insert)(i)命令会在指定行前增加一行

echo 'Test Line 2' | sed 'i\Test line 1'

在这里插入图片描述

追加(append)(a)命令会在指定行后增加一行

echo 'Test Line 2' | sed 'a\Test line 1'

在这里插入图片描述
要向数据流内部插入或附加数据,必须用地址告诉sed编辑器希望数据出现在什么位置。使用行号或文本模式都行,但不能用行区间。

sed '3i\This is an inserted line.' data6.txt

会在文本的第3行之前插入数据

sed '3a\This is an inserted line.' data6.txt

会在文本的第3行之后插入数据

sed '$a\This is an inserted line.' data6.txt

直接附加到行尾
在这里插入图片描述

修改行

修改(c)命令允许修改数据流中整行文本的内容,跟插入和追加命令的工作机制一样,必须在sed命令中单独指定一行
修改第二行的文本

sed '2c\This is a changed line of test.' data6.txt

在这里插入图片描述

文本模式会修改匹配的任意文本行

sed '/have 6 Infinity Stones/c\Snap!This is changed line of text.' data8.txt

在这里插入图片描述

使用地址区间需要小心,结果是将多行修改成了一行,而不是将匹配的多行都修改
在这里插入图片描述

转换命令

转换命令(y)是唯一可以处理单个字符的sed编辑器命令

[address]y/inchars/outchars

转换命令会对inchars和outchars进行一对一的映射。inchars中的第一个字符会被转换成第一个字符,inchars中的第二个字符会被转换为第二个字符,这个映射过程会一直持续到处理完指定字符。如果inchars和outchars的长度不同,则sed编辑器会产生一条错误消息。
转换命令是一个全局命令,会对文本中所有匹配到的字符进行转换,不考虑字符出现的位置

echo "Test #1 of try #1." | sed 'y/123/678/'

在这里插入图片描述

再探打印

  • 打印命令(p)用于打印文本行
echo "This is a test" | sed 'p'

打印出所有的文本

sed -n '/3rd line/p' data6.txt

打印出包含匹配文本模式的行

sed -n '2,3p' data6.txt

打印出数据流中的部分行

sed -n '/3/{p;s/line/test/p}' data6.txt

在使用替换或修改命令做出改动之前查看相应的行
在这里插入图片描述

  • 等号(=)命令用于打印行号
sed -n '/text/{=;p}' data7.txt

数据流中查找特定文本,然后打印行号和内容
在这里插入图片描述

  • 列出(l)命令用于列出行

列出命令可以打印数据流中的文本和不可打印字符

sed -n 'l' data10.txt

在这里插入图片描述

使用sed处理文件

  • 写入文件
    写入(w)命令用来向文件写入行,命令格式如下:
[address]w filename

filename可以使用相对路径或绝对路径,运行sed编辑器的用户必须具有文件的写权限。地址可以是sed支持的任意类型的寻址方式,比如单个行号、文本模式、行区间或文本模式区间。

sed '1,2w test.txt' data6.txt

将数据流的前两行写入文本文件

sed -n '1,2w test.txt' data6.txt

不在STDOUT中显示文本行,可以使用sed的-n选项

  • 将匹配文本模式的数据行写入目标文件
    sed -n '/Browncoat/w Browncoats.txt' data12.txt
    
    在这里插入图片描述
  • 从文件读取数据
    可以通过i或者a向数据流中插入或追加内容,而读取(r)命令允许将一条独立文件中的数据插入数据流,格式如下
[address]r filename

filename参数指定了数据文件的绝对路径或相对路径。读取命令中无法使用地址区间,只能指定单个行号或文本模式地址。sed编辑器会将文件内容插入指定地址之后。

sed '3r data13.txt' data6.txt

要在数据流的末尾添加文本,只需要使用美元符号地址即可

sed '$r data13.txt' data6.txt

在这里插入图片描述
使用文本模式地址将数据文件中的所有行插入数据流
在这里插入图片描述
读取命令还有一个很酷的用法是和删除命令配合使用,利用另一个文件中的数据来替换文件中的占位文本

[root@192 Chapter19-Scripts]# cat notice.std
Would the following people:
LIST
please report to the ship's captain.
[root@192 Chapter19-Scripts]# cat data12.txt
Blum, R       Browncoat
McGuiness, A  Alliance
Bresnahan, C  Browncoat
Harken, C     Alliance
[root@192 Chapter19-Scripts]# sed '/LIST/{
> r data12.txt
> d
> }' notice.std

在这里插入图片描述

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

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

相关文章

Mybatis 框架 ( 三 ) Mybatis-Plus

4.Mybatis-plus 官网 : https://www.baomidou.com/ MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上封装了大量常规操作&#xff0c;减少了SQL的编写量。 4.1.Maven依赖 使用时通常通过Springboot框架整合使用 并且使用Lombok框架简化实体类 <…

django显示echart图表:柱状图、折线图、饼图、地图、词云

django显示echart图表 效果: 示例demo 点我查看 1、urls.py 其中关键代码: urlpatterns = [path("book_chart/", views.book_chart, name="book_cha

【23】linux进阶——linux的软链接和硬链接

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

RebbitMQ Windows安装

RabbitMQ是由Erlang语言写的,因此安装前要先安装Erlang Erlang及RabbitMQ安装版本的选择 下载时一定要注意版本兼容性 版本兼容说明地址&#xff1a;RabbitMQ Erlang Version Requirements — RabbitMQ 我们选择的版本 Erlang官网下载:https://www.erlang.org/downloads Ra…

JavaScript 笔记

1 简介 JavaScript 诞生于1995年&#xff0c;是由网景公司发明&#xff0c;起初命名为LiveScript&#xff0c;后来由于SUN公司的介入&#xff0c;更名为 JavaScript。1996年微软在其最新的IE3浏览器中引入了自己对JavaScript的实现JScript&#xff0c;于是市面上就存在两个版本…

Guitar Pro8苹果mac最新版本下载安装教程

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 Mac如何安装。 guitar pro是一款专业的吉他学习软件&…

【VM服务管家】专题_7.5 异常收集

目录 5.1 信息收集&#xff1a;异常报错信息收集的方法5.2 日志等级&#xff1a;日志等级调低的方法 5.1 信息收集&#xff1a;异常报错信息收集的方法 描述 环境&#xff1a;VM4.0以上VS2013及以上 现象&#xff1a;未知问题、偶发问题、崩溃问题如何收集信息提供给研发排查。…

【网络协议详解】——GNS3的使用(学习笔记)

&#x1f4d6; 前言&#xff1a;在IT领域&#xff0c;网络协议的理解和掌握是至关重要的。GNS3和Wireshark是非常实用的工具&#xff0c;它们可以帮助你深入了解TCP/IP协议和网络的运作情况。 目录 &#x1f552; 1. 网络协议分析工具——GNS3&#x1f558; 1.1 快速上手&#…

一篇你看得懂的SNP

单核苷酸多态性&#xff0c;&#xff08;Single Nucleotide Polymorphism&#xff0c;简称SNP&#xff09;指的是由单个核苷酸—A,T,C或G的改变而引起的DNA序列的改变&#xff0c;造成包括人类在内的物种之间染色体基因组的多样性。是指在基因组上单个核苷酸的变异&#xff0c;…

一篇带你了解大厂都在用的DDD领域驱动设计

一、DDD到底是什么 DDD全称Domain Driven Design&#xff0c;领域驱动设计。 为了解决快速变化、复杂系统的设计问题的 领域驱动设计是Eric Evans在2004年发表的Domain Driven Design&#xff08;领域驱动设计&#xff0c;DDD)著作中提出的一种从系统分析到软件建模的一套方…

Windows安装mariadb,配置环境变量(保姆级教学)

软件下载地址&#xff1a;https://mariadb.com/downloads/ 1.双击下载好的软件 2.点击next 3.勾选我同意&#xff0c;点击next 4.这里那你可以设置你要安装的路径&#xff0c;也可以使用默认的&#xff0c;之后点击next 5.如图所示&#xff0c;设置完点击next 6.接下来就默…

Java面试题总结 | Java面试题总结8- Redis模块(持续更新)

Redis 文章目录 Redisredis的线程模型Redis的Mysql的区别Redis和传统的关系型数据库有什么不同&#xff1f;Redis常见的数据结构zset数据结构Redis中rehash过程redis为什么不考虑线程安全的问题呢Redis单线程为什么还能这么快&#xff1f;为什么Redis是单线程的&#xff1f;red…

JSP 的本质原理解析:“编写的时候是JSP,心里想解读的是 java 源码“

JSP 的本质原理解析&#xff1a;“编写的时候是JSP&#xff0c;心里想解读的是 java 源码” 文章目录 JSP 的本质原理解析&#xff1a;"编写的时候是JSP&#xff0c;心里想解读的是 java 源码"每博一文案1. JSP 概述2. 第一个 JSP 程序3. JSP 的本质就是 Servlet4. J…

R语言 | 日期和时间的处理

目录 一、日期的设定与使用 1.1 as.Date()函数 1.2 weekdays()函数 1.3 months()函数 1.4 quarters()函数 1.5 Sys.localeconv()函数 1.6 Sys.Date()函数 1.7 再谈seq()函数 1.8 使用不同格式表示日期 二、时间的设定与使用 2.1 Sys.time()函数 2.2 as.POSIXct()函数…

【Python】selenium工具

目录 1. 安装 2. 测试 3. 无头浏览器 4. 元素定位 5. 页面滑动 6. 按键、填写登录表单 7. 页面切换 Selenium是Web的自动化测试工具&#xff0c;为网站自动化测试而开发&#xff0c;Selenium可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff0c;可以接…

P1915 [NOI2010] 成长快乐

此题为世纪难题 题目提供者 洛谷 难度 NOI/NOI/CTSC 输入输出样例 输入 #1 5 1 6 0 0 1 5 2 2 0 0 输出 #1 1 5 5 2 2 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~此题非常难&#xff0c;小白就不用想着独自完成了 题解&#xff1a; #…

常用HTML标签分享系列一

前言 HTML,超文本标记语言,由标签组成,分为单标签和双标签,每个标签的属性id唯一,但name不唯一,其基本结构为Dom(Document Object Mode 文档对象模型)树,如图: <html lang"en"> <head><!-- 头部内容 --> </head> <body><!-- 身体内…

安装配置goaccess实现可视化并实时监控nginx的访问日志

一、业务需求 我们安装了nginx后,需要对nginx的访问情况进行监控(希望能够实时查看到访问nginx的情况),如下图所示: 二、goaccess的安装配置步骤 2.1、准备内容 需要先安装配置nginx或OpenResty - 安装 Linux环境对Nginx开源版源码下载、编译、安装、开机自启https://b…

Photoshop如何使用绘画和图像修饰之实例演示?

文章目录 0.引言1.给图像添加渐变色效果2.快速创建一副素描画3.清除图像中多余的景物4.快速融合两张图像5.调整图像光影6.人像面部瑕疵修除7.美化眼睛 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其…

第 02 章 OSPF实验

2.1 OSPF 回顾 2.1.1 实验目的 在 CCNA 中&#xff0c;我们学习到了 OSPF 是一个链路状态路由协议&#xff0c;和 RIP 以及 EIGRP 的最大 不同在于对于它们对于网络的认识以及根本的算法的不同。通过对 CCNA 中 OSPF 配置实验 的回顾&#xff0c;从中加强我们对 OSPF 的理解。…