ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sed命令详解

2020-01-16 14:52:37  阅读:252  来源: 互联网

标签:执行命令 打印 fstab 模式 命令 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 -n '2,3p' fstab  #只打印第2行到第3行的内容到屏幕

 

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

 

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

 

 

 

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

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

 

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

 

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

二、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 '3p' fstab  #没有加n意思为打印出所以的文本,将第三行的内容追加到第三行后面

 

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

 

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

 

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

 

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

 

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

 

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

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

 

三、sed工具

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

  g  #行内全局替换

  p  #显示替换成功的行

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

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

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

 

举例:取出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的处理过程:

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

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

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

举例:倒序显示文本内容

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

 

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第二次取数据:读取第由于第二行已经被取过了,这里取第三行,同上删除第一行,模式空间中的数据为第四行

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

标签:执行命令,打印,fstab,模式,命令,sed,空间,详解
来源: https://www.cnblogs.com/awanderer/p/12196030.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有