十四、shell编程三剑客(2)sed

1.前言

  sed也叫流编辑,是一种在线的、非交互的编辑器,他一次成立一行内容。处理时,把当前处理的行储存在临时缓冲区中,称为“模式空间”,见着用sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。

  接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有改变,除非你使用重定向存储输出,sed主要用来自动编辑一个或多个文件;简化对文件的反复操作。

 

2.格式

  sed  选项  命令  文件

  sed  选项 -f  脚本  文件  (不常用)

 

3.返回值

  都是0,对错不管

  只有当命令存在语法错误时,sed的退出状态才是非0.

 

4.汇总示例

  删除命令:d

    sed -r '/root/d' passwd  删除有rood的那行

    sed -r '3d' passwd  删除第三行

    sed -r '3{d}' passwd  删除第三行(专业点)

    sed -r '3{d;}' passwd  删除第三行,且还有其他命令

    sed -r '3,$d' passwd  删除3到最后一行

    sed -r '$d' passwd  删除最后一行

  

    蹦出来的是草稿,并没有执行,如果要执行要用-ri

  

 

  替换命令:s

    sed -r 's/root/aofa/' passwd  替换每行第一个root为aofa

    sed -r 's/root/aofa/' passwd  替换每行行首的root为aofa

    sed -r 's/root/aofa/g' passwd  替换全局的root为aofa,就是所有替换

    sed -r 's/[0-9][0-9]$/&.5/' passwd  替换行尾的两个数字,其后加上.5,这里的&就是等于前方的内容

    vi也有类似的功能:

      &用法:每一行开头都加#

      :% s/.*/#&/g  %是每一行的意思

      

 

 

    sed -r 's/(mail)/E\1/g' passwd  把所有的mail改成Email

    sed -r 's#(mail)#E\1#g' passwd  和上面一样,只是把s///换成s###

    

  替换整行命令:c

    sed -r '1caaaa' passwd  把第一行内容替换成aaaa

    示例:sed -ri '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

    sed -r '2c333\

    >444' passwd  将一行替换成多行

    sed -r '2,3c333' passwd  将多行换成一行

 

  读文件命令:r

    sed -r 'r 3.txt' passwd  是逐行处理,会每行都出现3.txt内容

    sed -r '$r 3.txt' passwd  尾行再读取3.txt

    sed -r '/root/r 3.txt' passwd  在root那一行后面读取3.txt

    vi 中也有类似命令

      :$ r 3.txt

    

  写文件命令:w(另存为)

    sed -r 'w 99.txt' passwd  把passwd的内容全部存去99.txt

    sed -r '/root/w 99.txt' passwd  把passwd中root的那行存去99.txt

    sed -r '1,5w 99.txt' passwd  把1-5行的内容存去99.txt

 

  追加命令:a(之后)

    sed -r 'a123' passwd  逐行读取在passwd每一行后追加123

    sed -r '2a123' passwd  在passwd第二行后面追加123

    sed -r '2a 1111\

    >2222\

    >3333\

    >4444\' passwd  在passwd插入多行

 

  插入命令:i(之前)

    sed -r 'i123' passwd  逐行读取在passwd每一行后追加123

    sed -r '3i123' passwd  在passwd第三行之前追加123

 

 

  获取下一行命令:n

    sed -r '/root/{n;d}' passwd  对passwd中root那行的下一行进行命令‘删除’

    sed -r '/root/{n;s/bin/ding/g}' passwd  对passwd中root那行的下一行进行替换,把那行所有bin改成ding

 

  反向选择:!

    sed -r '2,$!d' passwd  passwd的2最后一行以外的‘删除’

 

  多重编辑:e

    sed -r -e '1,3d' -e '4s/adm/admin/g' passwd  同时发生,第1到第3行删除,第4行所有的adm替换成admin

    sed -r '1,3d;4s/adm/aaa/g' passwd  与上同理,同时发生

    sed -r '2s/bin/ding/g;2s/nologin/bash/' passwd  同理

    sed -r '2{s/bin/ding/g;s/nologin/nonono/}' passwd  同理,和2{n;d}原理一样

posted @ 2022-02-20 23:20  真渡  阅读(109)  评论(0)    收藏  举报