sed编辑器基础命令

news2024/10/7 19:22:46

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

在这里插入图片描述

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

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

相关文章

人脸检测--传统方法

人脸检测与识别综述 人脸检测与识别是计算机视觉和生物识别领域中最受关注的研究内容。 如何从包含人脸内容的图像、视频等多媒体数据中,找到人脸,并对其身份进行判定,是人脸检测与识别中的主要问题。 应用场景 - 安全监控 - 访问控制 …

【Java校招面试】基础知识(一)——Java常用类库

目录 前言一、编程时常用的Java类库1. 异常捕获模块(try-catch-finally, Error, Exception)2. boolean / short / int / long / float / double / char / byte及其对应的引用类型 二、面试时常考的Java类库1. 一切类型的父类Object及其equals / hashCode / toString方法2. 常用…

anaconda安装pytorch的流程

1.查看本机支持的CUDA版本 cmd:nvidia-smi 2.安装本机支持的CUDA版本 CUDA安装教程 GPU, CUDA,cuDNN三者的关系总结 3.使用anaconda创建虚拟环境 3.在anaconda对应的虚拟环境中安装CUDA对应的pytorch版本 anaconda安装pytorch(anaconda3,Windows10&am…

idea使用 ( 二 ) 创建java项目

3.创建java项目 3.1.创建普通java项目 3.1.1.打开创建向导 接 2.3.1.创建新的项目 也可以 从菜单选择建立项目 会打开下面的选择界面 3.1.2.不使用模板 3.1.3.设置项目名 Project name : 项目名 Project location : 项目存放的位置 确认创建 3.1.4.关闭tips 将 Dont s…

二叉搜索树【Java】

文章目录 二叉搜索树的性质二叉搜索树的操作遍历查找插入删除 二叉搜索树又称为二叉排序树,是一种具有一定性质的特殊的二叉树; 二叉搜索树的性质 若它的左子树不为空,则左子树上结点的值均小于根节点的值; 若它的右子树不为空&a…

08 Kubernetes应用配置管理

课件 在 Kubernetes 中,secret 是一种用于存储敏感信息的对象。Kubernetes 支持以下三种类型的 secret: Opaque:这是默认的 secret 类型,可以用于存储任何类型的数据,包括字符串、二进制数据等。 Service Account&…

【P2】Jmeter 线程组的并行与串行

一、串行与并行规则 (1)、测试计划中的执行顺序遵循:setUp 线程组 -> 线程组 -> tearDown 线程组 (2)、如果将测试计划中的独立运行每个线程组勾选上,则多个线程组串行执行,否则并发执行…

吴恩达 Chatgpt prompt 工程--5.Transforming

探索如何将大型语言模型用于文本转换任务,如语言翻译、拼写和语法检查、音调调整和格式转换。 Setup import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopenai.api_key os.getenv(OPE…

2.6 浮点运算方法和浮点运算器

学习目标: 以下是一些具体的学习目标: 理解浮点数的基本概念和表示方法,包括符号位、指数和尾数。学习浮点数的运算规则和舍入规则,包括加、减、乘、除、开方等。了解浮点数的常见问题和误差,例如舍入误差、溢出、下…

Unity一般打包流程

Unity一般打包流程 通常打包流程主要是通过 Building setting来选择需要打包的场景后出包到指定文件夹位置,也可以采用 [MenuItem("MyMenu/Do Something")]中使用static函数来选择打包路径和打包方式——需要将该脚本放置在 Editor文件夹下 [MenuItem(&…

Vue3源码 第六篇-JavaScript AST transform函数

系列文章目录 Vue3源码 第一篇-总览 Vue3源码 第二篇-Reactive API Vue3源码 第三篇-Vue3是如何实现响应性 Vue3源码 第四篇-Vue3 setup Vue3源码 第五篇-Vue3 模版compile AST生成篇 文章目录 系列文章目录前言一、transform 转换二、traverseNode 遍历节点,trave…

B/S结构系统的会话机制(session)

B/S结构系统的会话机制(session) 文章目录 B/S结构系统的会话机制(session)每博一文案1. session 会话机制的概述2. 什么是 session 的会话3. session 的作用4. session 的实现原理解释5. 补充: Cookie禁用了,session还能找到吗 ?6. 总结一下…

PCA学习

前置知识 统计 假设数据集 X ∈ R n m \mathbf{X}\in\mathbb{R}^{n\times m} X∈Rnm,其中 n n n表示样本数量, m m m表示特征个数 均值 X ˉ 1 n e T X 1 n ∑ i 1 n X i \bar{\mathbf{X}} \frac{1}{n}\mathbf{e}^T\mathbf{X} \frac{1}{n} \sum_{i1}^{n}\mat…

[架构之路-178]-《软考-系统分析师》- 分区操作系统(Partition Operating System)概述

目录: 本文概述: 1.1 什么是分区操作系统 1.2 分区操作系统出现背景 1. 前后台系统(Foreground/Background System) 2. 实时操作系统(RTOS) 本文概述: 随着嵌入式系统日趋复杂化以及对安全性要求的不断提高,采用空间隔离、时…

java学习之枚举二

目录 一、enum关键字实现枚举 二、注意事项 一、对Season2进行反编译(javap) ​编辑 三、练习题 第一题 第二题 一、enum关键字实现枚举 package enum_;public class Enumeration03 {public static void main(String[] args) {System.out.println…

el-upload组件的文件回显功能和添加文件到elupload组件

省流: 先获取这个文件对象,使用handleStart方法添加到组件。 this.$refs.uploadRefName.handleStart(rawfile); 在开发的时候遇到表单里需要上传图片的功能。看了下el-upload组件的使用方法,在修改表单的时候,el-upload组件的回显…

flutter学习之旅(二)

如果不知道怎么安装编写可以查看这篇 创建项目 另一个创建方法 flutter create 项目名热部署 vscode 热部署 vscode很简单:可以通过Debug进行调试 使用flutter查看设备 flutter devices如图所见我现在用的是windows所以,我们检测不到ios因为 我们看…

【Fluent】边界类型总结,什么时候用壁面对(wall-shadow pair)、什么时候用interface?

一、fluent自动生成边界类型的规律 Enclosure是包裹在外面的气体(流体),mold是模具(固体),sheet是模具上的薄板件(固体)。 1.1 正向思维 不管是流体域还是固体域,每一…

高度可定制可用于商用目的全流程供应链系统(全部源码)

一、开源项目简介 高度可定制零售供应链中台基础系统,集成零售管理, 电子商务, 供应链管理, 财务管理, 车队管理, 仓库管理, 人员管理, 产品管理, 订单管理, 会员管理, 连锁店管理, 加盟管理, 前端React/Ant Design, 后端Java Spring自有开源框架,全面支…

软件测试之黑盒测试的具体方法详解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一.基于需求的设计方法二.等价类三.边界值四.判定表4.1 **关系**4.2 如何设计测试用例4.3 实际案例第一步第二步第三步第四步 五.正交排列5.1 什么是正交表5.2 …