sed命令详解

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

然后读入下一行,执行下一个循环。这样不断重复,直到文件最后。文件内容并没有改变,除非使用重定向存储输出。

sed语法:sed [option]……'script' inputfile……

常用选项:

-n  #不输出模式空间内容到屏幕,即不自动打印到屏幕

-e  #多点编辑

-f  /PATH/SCRIPT_FILE  #从指定文件中读取编辑脚本

-r  #支持扩展的正则表达式

-i.bak  #备份文件并原处编辑,.bak可以自定义

一、script,地址命令

地址定界:

1、不给地址,则对全文进行处理

2、单地址:n:指定的行,$:最后一行

  /pattern/:被此处模式所能匹配到的每一行

3、地址范围

  n1,n2  #意思为文本的n1行到n2行

  n,+m  #意思为显示n行,以及其后面的m行

  /pat1/,/part2/  #从匹配到pat1的行到part2的行

  n,/pat1/  #从n行开始,到pat1行结束

4、~:步进

  1~2  #奇数行

  2~2  #偶数行

举例:打印指定行的内容到屏幕

执行命令:sed -n 'p' fstab #后面的p是指将匹配到前面的地址的内容打印到屏幕,这里前面的地址范围为空,则表示匹配文件所有的行

sed命令详解_第1张图片

 

 执行命令:sed -n '2,3p' fstab  #只打印第2行到第3行的内容到屏幕

sed命令详解_第2张图片

 

 执行命令: sed -n '6,$p' fstab  #只打印出第6行到文本最后一行得内容

sed命令详解_第3张图片

 

 执行命令:sed -n '/^#/p' fstab    #匹配/ /中的模式,打印出以#开头的行

 sed命令详解_第4张图片

 

 

 执行命令:sed -n '2,/\/dev\/disk/p' fstab  #打印第二行到包含/dev/disk的行的所有内容

sed命令详解_第5张图片

执行命令:sed -n '/\/etc\/fstab/,/xfs/p' fstab  #打印出从包含/etc/fstab的行到包含xfs的行的内容

sed命令详解_第6张图片

 

执行命令:sed -n '1~2p' fstab  #打印出文档中的奇数行

sed命令详解_第7张图片

 

执行命令:sed -n '2~2p' fstab  #打印出文本的偶数行

sed命令详解_第8张图片

二、sed的编辑命令

d  #删除模式空间匹配的行,并开启下一轮循环

p  #打印出模式匹配的行,追加到默认输出的后面

a [\]text  #在指定的行后面追加一行,支持使用\n追加多行

i [\]text  #在指定的行前面追加一行,支持使用\n追加多行

c [\]text  #替换行为单行或多行文本

w /path/file  #保存模式匹配的行至指定文件

r /path/file  #读取指定文件的文本至模式空间中匹配到的行的行后

=  #为模式空间中的行打印行号

!  #模式空间中匹配行取反处理

举例:打印出除/dev/mapper所在行的所有行

执行命令:sed -n '/\/dev\/mapper/d;p' fstab  #删除模式匹配到的行,然后打印出来,中间;表示执行完第一个命令后执行第二个命令

sed命令详解_第9张图片

 

 执行命令:sed '3p' fstab  #没有加n意思为打印出所以的文本,将第三行的内容追加到第三行后面

sed命令详解_第10张图片

 

执行命令:sed  '/^UUID/a\this is a test' fstab  #在UUID后面追加一行文本,this is a test

sed命令详解_第11张图片

 

 执行命令:sed  '/^UUID/i\this is a test' fstab  #在匹配的行的前面追加一行文本

sed命令详解_第12张图片

 

执行命令:sed  '/^UUID/c\this is a test\na test' fstab  #将匹配到的行替换为指定的文本内容,\n意为换行

sed命令详解_第13张图片

 

执行命令:sed -n '/^UUID/w/root/fstab1' fstab

 

 执行命令:sed '/UUID/r/root/zhuijia' fstab  #将/root/zhuijia中的内容追加到匹配到的行的后面

sed命令详解_第14张图片

 

执行命令:sed -n '/UUID/=' fstab      #打印出含有该字符的行的行号

执行命令:sed -n '/UUID/!p' fstab  #打印除匹配到的行以外的所有的行

sed命令详解_第15张图片

 

三、sed工具

s///  #查找替换,支持使用s@@@或者s###

  g  #行内全局替换

  p  #显示替换成功的行

  w /path/file  #将替换成功的行保存至文件中

举例:将fstab文件中的#全部去掉,然后打印出来

执行命令:sed -nr 's/# *//g;p' fstab  #将所有的#且后面至少有一个空格的内容替换成无,然后选择所有行,并打印出来

sed命令详解_第16张图片

 

举例:取出UUID=后面的那一串数字,并打印出来

执行命令:sed -nr 's/UUID=(*) \/boot*/\1/p' fstab  #利用正则的分组,将等号后面的内容取出并打印

 

四、sed高级应用

P  #打印模式空间开端至\n内容(即模式空间第一行内容),并追加到默认输出之前

h  #把模式空间中的内容覆盖至保持空间中

H  #把模式空间中的内容追加至保持空间中

g  #从保持空间取出数据覆盖至模式空间

G  #从保持空间取出内容追加至模式空间

x  #把模式空间中的内容与保持空间中的内容进行互换

n  #读取匹配到的行的下一行覆盖至模式空间

N  #读取匹配到的行的下一行追加至模式空间

d  #删除模式空间中的行

D  #如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使

   用合成的模式空间重新启动循环。如模式空间不包含换行符,则会像发出d命令那样启动正常的新的循环。

保持空间:即在sed处理数据时,数据的一个暂存空间,sed默认是处理完一行的数据后,就清空模式空间的内容,继续进行下一一行的数据处理,保持空间则能暂时的存放数据。

举例:打印文本的偶数行内容

执行命令:sed -n 'n;p' num

sed命令详解_第17张图片

 

 sed的处理过程:

sed第一次取数据到模式空间时,因为有n参数,所以sed就把第二行的数据取出并覆盖到模式空间中,此时模式空间就只有第二行数据,然后执行p操作打印

sed第二次取数据时,由于第二行数据已经取过了,所以从第三行开始取,取的时候,仍然受到n参数影响,所以sed把第四行的数据取出放到了模式空间中,并打印。

sed的后续也是按照上面的那种方法取出数据,所以sed取出的数据应该依次为:第二行数据、第四行数据、第六行数据……即文本的所有偶数行,然后通过p选项打印到屏幕

举例:倒序显示文本内容

执行命令:sed '1!G;h;$!d' num

sed命令详解_第18张图片

 

sed工作过程:

sed第一次取数据:运行1!G时,由于是第一行,所以不需要执行G操作,然后在执行h操作,即将第一行数据覆盖到保持空间中,然后删除模式空间中的行。

         此时模式空间中为空,保持空间中为第一行数据

sed第二次取数据:由于是非首行,执行G操作,将保持空间中的第一行取出追加到模式空间的的第二行的后面,再执行h操作,将第一行第二行复制到保

          持空间中,并删除模式空间的内容,此时模式空间为空,保持数据为第二行和第一行

如上执行过程,直到遇到了最后一行,将保持空间中的数据第9、8、、6、5、4、3、2、1行追加到模式空间中,由于是最后一行,不执行d动作,此时的

模式空间中数据为:第10、9、8、7、6、5、4、3、2、1行,由于sed默认打印出所有处理过的行,而之前的操作模式空间都为空,所以不打印,到了最

后一行,将模式空间中的数据打印出来。

举例:打印出文本的最后一行

执行命令:sed 'N;D' num

 

 sed工作过程:

sed第一次取数据:读取第一行,然后执行N操作,将第二行的数据追加到模式空间,而后执行D操作,由于模式空间中有换行符,删除模式空间的第一行,即

          模式空间中的数据为第二行。

sed第二次取数据:读取第由于第二行已经被取过了,这里取第三行,同上删除第一行,模式空间中的数据为第四行

在此合成的模式空间启动循环,直至再也没有新的行读入,模式空间中就只有最后一行数据。然后打印到屏幕。

你可能感兴趣的:(sed命令详解)