上一篇对正则表达式以及linux三剑客grep的讲解后,这一篇对sed重点介绍。

一、sed简介

  sed表示流编辑器(Stream Editor)。这是一个简单但功能强大的工具,分析文本,并无缝地转换它。 sed是在1973-1974年由贝尔实验室的李E. McMahon开发。如今,它运行在所有主要的操作系统。

  McMahon编写了一个通用的面向行的编辑器,它最终成为sed。sed借用语法和ed编辑许多有用的功能。自成立开始,就对正则表达式有所支持。sed接受来自文件以及管道的输入。此外,它也可以接受来自标准输入的数据流的输入。

  sed是自由软件由基金会(FSF)维护,它是由GNU/ Linux分发。因此,它通常被称为GNU sed的。对于新手用户,sed语法看起来神秘。但是,一旦熟悉了它的语法,就可以使用sed的几行脚本解决许多复杂的任务。

二、sed的工作流程

  它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容, 处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间(处理的文件)。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

下面会有举例对执行流程具体说明

三、sed典型用途

sed可以有许多不同的方式使用,例如:

文本替换

选择性打印的文本文件

一个就地文本文件的编辑

文本文件的非交互式的编辑等等。

四、sed工具

1、功能:

  主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

  参考地址

2、语法:

sed[option]... 'script' inputfile...

3、常用选项:

-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本 这里的编辑脚本每行一个不需要带引号
-r: 支持使用扩展正则表达式 regexp-extended
-i.bak: 备份文件并原处编辑

4、script(脚本):

'地址命令'

5、地址定界:

(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,# 从哪行开始到哪行结束
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
first~step
first 指起始匹配行, step 指步长
举例:
1~2 奇数行
2~2 偶数行

6、编辑命令:

d: 删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a [\]text:在指定行后面追加文本
支持使用\n实现多行追加
i[\]text:在行前面插入文本
c [\]text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中
匹配到的行后:
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

五、sed工具使用实例:


~]# sed -n '1p' passwd #只打印第一行
~]# ifconfig eth1 |sed -n 2p #打印网卡1那一行的ip地址
~]# seq 100 |sed -n '1~2p' #步进,只显示奇数行
~]# seq 100 |sed -n '2~2p' #步进,只显示偶数行
~]# sed -i.orig 's/dog/cat/g' pets #备份后再替换
~]# sed '2a\dog cat dog cat cat' pets #在第二行后增加新行
~]# sed '2i\dog cat dog cat cat' pets #在第二行前增加新行
~]# sed '2c\dog cat dog cat cat' pets #替换第二行
~]# sed '2w /path/filename' pets #将第二行保存到指定文件
~]# sed '2r /path/filename' pets #将指定文件读取并加到第二行后
~]# sed '=' pets #在显示的结果前显示行号

六、sed的模式空间和保持空间

  sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。

  模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。

  保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。

  正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!

  sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

  一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即可完成主要任务。但是某些时候,通过使用保持空间(hold space),还可以带来意想不到的效果。

1、高级编辑命令选项:

P:打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

2、高级编辑举例:

~]#  sed -n 'n;p' FILE
#显示偶数行
~]# sed '1!G;h;$!d' FILE
#逆向显示文件内容
~]# sed 'N;D' FILE
#仅显示最后一行
~]# sed '$!N;$!D' FILE
#仅显示文件最后两行
~]# sed '$!d' FILE
#仅保留最后一行
~]# sed ‘G’ FILE
#每行后加一个空行
~]# sed ‘g’ FILE
#将每行内容替换为空行
~]# sed ‘/^$/d;G’ FILE
#每行后加一个空行,已有空白行的,仅显示一个空白行
~]# sed 'n;d' FILE
#显示奇数行
~]# sed -n '1!G;h;$p' FILE
#逆向显示文件内容

3、对具体实例实现原理图解说明

~]#  sed '1!G;h;$!d' FILE.txt
#逆序显示

注意:sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。

对各命令先复习一下吧!

1!:  第一行除外
G: 把保持空间的内容读取回来追加至模式空间
h: 把模式空间的内容覆盖保存至保持空间
$!: 最后一行除外
d: 把空间的内容都删除

对FILE.txt的执行结果进行梳理























)



通过对三行整个流程的解析可以知道整个显示出来的结果是逆序,非常神奇。

未来还会有更加好用的工具,用高级编辑命令在生产中不多的。

linux下文本三剑客之sed的更多相关文章

  1. Linux Bash文本操作之sed篇其二

    上一篇总结了sed的基础应用(Linux Bash文本操作之sed篇其一),内容实在有够多,这里再对稍微高级一些的用法做一个整理,以方便使用时查阅. 查看文本内容 示例1表示在第一到第四行匹配到的行后 ...

  2. 6.文本三剑客之sed

    文本三剑客之sed 目录 文本三剑客之sed sed编辑器 sed概述 sed工作流程 sed用法 sed打印 sed删除 sed替换 sed增加行内容 sed剪切粘贴与复制粘贴 sed字符/字符串交 ...

  3. Linux Bash文本操作之sed篇其一

    作为Linux系统中文本处理的强力工具之一,sed功能强大,用法多变,值得我们好好学习. sed是用于过滤和转换文本的流编辑器. 一般情况下sed把当前处理的行存储在临时缓冲区,按指定命令处理之后将缓 ...

  4. Linux 下文本查找技巧你掌握了吗?

    前言 之前介绍过很多linux下查找相关的命令,例如<Linux中的文件查找技巧>,<find命令高级用法>,<如何查看linux中文件打开情况-lsof命令>等等 ...

  5. 文本三剑客之sed的用法

    第1章            Sed命令 1.1  sed 命令执行过程 1.2  sed介绍 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(p ...

  6. linux基础—课堂随笔05_文本三剑客之SED

    1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  7. Linux 文本三剑客之 sed

    Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...

  8. Linux下文本浏览器lynx

    一般登录到Linux上的时候都是使用Shell登录上去的,但是如果这个时候我们有浏览网页的需求怎么办,比如我刚刚部署上去一个网站,但是我并不知道我有没有部署成功,而且只能在这一台Linux上能够访问到 ...

  9. 文本三剑客之sed

    sed是一个流编辑器(sed是stream editor的缩写),它可以对从标准输入流中得到的数据进行处理,然后把处理以后得到的结果输出到标准输出,而标准输出通常会关联到终端屏幕,因此处理后的结果也会 ...

随机推荐

  1. 算法修炼之路——【链表】Leetcode24 两两交换链表中的节点

    题目描述 给定一单链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是简单的改变节点内部的值,而是需要实际的进行节点交换. 示例: 输入:head = [1, 2, 3, 4] 输出:hea ...

  2. 《Mathematical Analysis of Algorithms》中有关“就地排列”(In Situ Permutation)的算法分析

    问题描述 把数列\((x_1,x_2,\cdots,x_n)\)变换顺序为\((x_{p(1)},x_{p(2)},\cdots,x_{p(n)})\),其中\(p\)是\(A=\{1,2,3,\cd ...

  3. TCP 的断包和粘包

    以太网中存在一个对于帧的有效数据大小的限制,即 MTU,以太网的 MTU 为 1500 字节. 一.断包 就是说发送端一次发送的消息长度过大,如果超过了 MTU,那么 ip 会对其进行分片. 在网络编 ...

  4. go server框架学习之路 - 写一个自己的go框架

    go server框架学习之路 - 写一个自己的go框架 用简单的代码实现一个go框架 代码地址: https://github.com/cw731/gcw 1 创建一个简单的框架 代码 packag ...

  5. SpringBoot中遇到的一些问题

    1.JQuery和bootstrap报404的问题 在html页面导入的js和css的时候,不要加static这级目录,直接跳过即可,例如 导入的时候不需要加static目录,直接导入js/和css/ ...

  6. [codevs1227]草地排水<Dinic网络流最大流>

    题目链接:http://codevs.cn/problem/1993/ https://www.luogu.org/problemnew/show/P2740 之前一直都没去管网络流这算法,但是老师最 ...

  7. Blazor入门笔记(1)-从0构建一个组件

    1.环境 VS2019 16.5.1 .NET Core SDK 3.1.200 Blazor WebAssembly Templates 3.2.0-preview2.20160.5 2.创建项目 ...

  8. python学习笔记--字符串格式化

    字符串和常量 print(r'hello\py\thon') r 代表后面字符不进行转义,原样输出; 表示常量,命名时变量名字大写代表常量.NAME = 'liulixue'; 字符串表示:' ', ...

  9. vagrant 入门案例 - 快速创建 Centos7

    中文文档:http://tangbaoping.github.io/vagrant_doc_zh/v2/ 参考: https://blog.csdn.net/yjk13703623757/articl ...

  10. SpringMVC(三):转发和重定型

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...