上一篇对正则表达式以及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. 一文总结数据科学家常用的Python库(上)

    概述 这篇文章中,我们挑选了24个用于数据科学的Python库. 这些库有着不同的数据科学功能,例如数据收集,数据清理,数据探索,建模等,接下来我们会分类介绍. 您觉得我们还应该包含哪些Python库 ...

  2. 热点 | github近期热点项目汇总

    本文是近期Github热点项目的汇总,如果你想了解更多优秀的github项目,请关注我们公众号的github系列文章. 推荐 | 7个你最应该知道的机器学习相关github项目 热点 | 六月Gith ...

  3. swagger2 接口文档,整个微服务接口文档

    1,因为整个微服务会有好多服务,比如会员服务,支付服务,订单服务,每个服务都集成了swagger 我们在访问的时候,不可能每个服务输入一个url 去访问,看起来很麻烦,所以我们需要在一个页面上集成整个 ...

  4. [codevs]1250斐波那契数列<矩阵乘法&快速幂>

    题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...

  5. 性能优化之三:将Dottrace过程加入持续集成

    之前分享过一篇如何做接口性能分析的文章,但是整个分析过程有点繁琐,需要写一个控制台程序调用被测接口,再预热.启动dottrace追踪,最后才能得到我们想要的性能分析报告.如果有办法一键生成性能分析报告 ...

  6. CodeForces 277A 红娘问题(并查子集)

    题目链接 思路如下 这题可以普通的并查集来做,我们把每个人认识的红娘,放到一个同一个集合里面,然后通过 for循环 遍历出现过的编号,看总共有几个集合,当集合的个数大于1的时候,需要的话费rmb的数量 ...

  7. Metrics:如何让线上应用更加透明?

    1. 上期我们结合<SRE Google 运维解密>,对监控系统进行了一次脉络梳理,知道一旦离开了监控系统,我们就没法辨别一个服务是不是在正常提供服务,就如同线上的服务在随风裸奔. 文章分 ...

  8. 苦涩的技术我该怎么学?Akka 实战

    上次我们在“懵 B”的状态下,聊了聊 Actor 模型的理论知识.稍微再补充两句,如上图所示在 Actor 模型系统中,主要有互不依赖的 Actor 组成(图中圆圈),Actor 之间的通信是通过消息 ...

  9. 配置一个mariadb数据库《二》

                                                             mariadb 配置一个数据库 案例4:配置一个数据库 4.1 问题 本例要求在虚拟机 ...

  10. 【数据库】MySQL数据库(二)

    一.数据库文件的导出 1.在DOS命令行下导出数据库(带数据) mysqldump -u root -p 数据库名 > E:\wamp\www\lamp175\lamp175.sql 2.在DO ...