linux下文本三剑客之sed
继上一篇对正则表达式以及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的更多相关文章
- Linux Bash文本操作之sed篇其二
上一篇总结了sed的基础应用(Linux Bash文本操作之sed篇其一),内容实在有够多,这里再对稍微高级一些的用法做一个整理,以方便使用时查阅. 查看文本内容 示例1表示在第一到第四行匹配到的行后 ...
- 6.文本三剑客之sed
文本三剑客之sed 目录 文本三剑客之sed sed编辑器 sed概述 sed工作流程 sed用法 sed打印 sed删除 sed替换 sed增加行内容 sed剪切粘贴与复制粘贴 sed字符/字符串交 ...
- Linux Bash文本操作之sed篇其一
作为Linux系统中文本处理的强力工具之一,sed功能强大,用法多变,值得我们好好学习. sed是用于过滤和转换文本的流编辑器. 一般情况下sed把当前处理的行存储在临时缓冲区,按指定命令处理之后将缓 ...
- Linux 下文本查找技巧你掌握了吗?
前言 之前介绍过很多linux下查找相关的命令,例如<Linux中的文件查找技巧>,<find命令高级用法>,<如何查看linux中文件打开情况-lsof命令>等等 ...
- 文本三剑客之sed的用法
第1章 Sed命令 1.1 sed 命令执行过程 1.2 sed介绍 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(p ...
- linux基础—课堂随笔05_文本三剑客之SED
1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...
- Linux 文本三剑客之 sed
Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...
- Linux下文本浏览器lynx
一般登录到Linux上的时候都是使用Shell登录上去的,但是如果这个时候我们有浏览网页的需求怎么办,比如我刚刚部署上去一个网站,但是我并不知道我有没有部署成功,而且只能在这一台Linux上能够访问到 ...
- 文本三剑客之sed
sed是一个流编辑器(sed是stream editor的缩写),它可以对从标准输入流中得到的数据进行处理,然后把处理以后得到的结果输出到标准输出,而标准输出通常会关联到终端屏幕,因此处理后的结果也会 ...
随机推荐
- 使用TensorFlow v2库实现线性回归
使用TensorFlow v2库实现线性回归 此示例使用简单方法来更好地理解训练过程背后的所有机制 from __future__ import absolute_import, division, ...
- coding++ :HttpClientUtils 封装
1.关键 JAR <!-- <<===================>> httpClient <<===================>> ...
- Ardupilot(PX4)飞控驱动蜂鸣器和RGB细节
Ardupilot(PX4)飞控驱动蜂鸣器细节 飞控代码细节 任务调用频率50HZ(20ms),buzzer.update() 内部将频率减少到10HZ(100ms) 单响(SINGLE_BUZZ) ...
- 一篇让你明白什么是浏览器BOM方法的笔记
BOM Browser Object Model 浏览器对象模型 虚拟机 ,任何语言编辑的程序都需要一个虚拟机来执行.如果脱离这个环境就无法运行. 浏览器就是一种虚拟机.用来解析html语言 同一款浏 ...
- 快速创建Flask Restful API项目
前言 Python必学的两大web框架之一Flask,俗称微框架.它只需要一个文件,几行代码就可以完成一个简单的http请求服务. 但是我们需要用flask来提供中型甚至大型web restful a ...
- ANTLR随笔(三)
ANTLR基本语法 前面已经简单介绍了ANTLR以及怎么安装和测试. 同学们应该大概清楚ANTLR的使用场景,但是对于关键步骤,怎么编写一个语法文件并没有详细介绍,这篇笔记主要详细讲解一下ANTLR的 ...
- Java 程序该怎么优化?(工具篇)
程序员:为什么程序总是那么慢?时间都花到哪里去了? 面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢? 工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直 ...
- 跨域问题:Cross origin requests are only supported for protocol schemes: http...
跨域:Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extensi ...
- 201771010108 -韩腊梅-java学习进度表
2018面向对象程序设计(Java)课程进度表 周次 (阅读/编写)代码行数 发布博文量/评论他人博文数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 30/40 1/0 8 ...
- web font各浏览器兼容问题以及格式
语法: @font-face { font-family: <identifier>; src: <fontsrc> [, <fontsrc>]*; <fon ...