十四、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}原理一样