欢迎来到zangfans的博客

扩大
缩小

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的执行结果进行梳理

image
image
image
image
image
image
image
image
image
image
image
image)
image
image

通过对三行整个流程的解析可以知道整个显示出来的结果是逆序,非常神奇。
未来还会有更加好用的工具,用高级编辑命令在生产中不多的。

posted on 2018-02-04 18:24  zangfans  阅读(475)  评论(0编辑  收藏  举报

导航