继上一篇对正则表达式以及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:在指定行后面追加文本
支持使用
实现多行追加
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 '2adog cat dog cat cat' pets #在第二行后增加新行
~]# sed '2idog cat dog cat cat' pets #在第二行前增加新行
~]# sed '2cdog 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:打印模式空间开端至
内容,并追加到默认输出之前
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的执行结果进行梳理
)
通过对三行整个流程的解析可以知道整个显示出来的结果是逆序,非常神奇。
未来还会有更加好用的工具,用高级编辑命令在生产中不多的。