一、sed介绍

sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作

二、sed工作原理

        sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

三、语法格式

语法:sed  选项 's/搜索的内容/替换的内容/' 需要处理的文件
        其中s表示search搜索,斜杠/表示分隔符,可以自定义动作,一般g表示全局(默认修改每一行第一次出现的内容),p表示打印(一般结合-n使用,否则会把内容重复输出)

复制文件/etc/selinux/config到/root进行演示
# cp /etc/selinux/config /root/ 

常用选项:

       -e        进行多项编辑              

例如:

#sed -e s/SELINUX=disabled/SELINUX=enforcing/ -e s/SELINUXTYPE=targeted/SELINUX=mls/ /root/config 


       -i        对源文件进行修改         

例如:

匹配修改每行第一次出现的SELINUX=disabled为SELINUX=enforcing
# sed -i s/SELINUX=disabled/SELINUX=enforcing/ /root/config 

匹配修改全局的SELINUX=disabled为SELINUX=enforcing,添加g参数
# sed -i s/SELINUX=disabled/SELINUX=enforcing/g /root/config 

       -n        安静模式,取消默认输

例如:
# sed -n s/SELINUX=disabled/SELINUX=enforcing/g /root/config  

只显示修改的内容,结合p使用
# sed -n 's/SELINUX=disabled/SELINUX=enforcing/gp' /root/config

       -f         可以指定脚本处理内容

例如:
# cat config | sed -f a.sh
脚本内容为
s/disabled/no/
s/SELINUX/selinux/
说明:在脚本文件中的子命令串就不需要输入单引号

       -r

sed命令的匹配模式支持正则表达式的,默认只能支持基本正则表达式,如果需要支持扩展正则表达式,那么需要添加-r选项。

例如:
# sed -r 's/(^SELINUX)|(system.)/A/g' config

四、常见的处理动作(增删改查)


i 在上面插入
a 在下面插入

在每一行下面添加666
# sed 'a666' /root/config
在最后一行下面添加666
# sed '$a666' /root/config

在每一行上面添加666
# sed 'i666' /root/config
在最后一行上面添加666
# sed '$i666' /root/config

在第六行下面添加666
# sed '6a666' /root/config
在第六行上面添加666
# sed '6i666' /root/config

在以SELINUX开头的上面插入666
# sed '/^SELINUX/i666/' /root/config

删除第一行
#sed '1d' /root/config

删除1到5行
#sed '1,5d' /root/config

删除最后一行
#sed '$d' /root/config

删除匹配到的行

# sed '/^SELINUX/d' config

语法:sed 's/搜索的内容/替换的内容/' 需要处理的文件

可以自定义分隔符
# sed -i s#SELINUX=disabled#SELINUX=enforcing# /root/config

需要替换的内容存在/,需要进行转移\
# sed -i s/SELINUX\/=\/disabled/SELINUX=enforcing/ /root/config  

替换为空就是删除,删除SELINUX=enforcing
# sed -i s/SELINUX=enforcing// /root/config

删除以SELINUX开头
 # sed -i s/^SELINUX// /root/config

修改在指定的行
# sed -i '7s/SELINUX=disabled/SELINUX=enforcing/g' /root/config 
# sed -i '1,7s/SELINUX=disabled/SELINUX=enforcing/g' /root/config 

在1-3行行首添加内容@@@
# sed '1,3s/^/@@@/' /root/config

打印第六行,或者打印1-6行,或者打印最后一行,打印每一行取消默认输出加-n

# sed -n '6p' /root/config
# sed -n '1,6p' /root/config
# sed -n '$p' /root/config
# sed -n 'p' /root/config

支持正则表达式(默认支持基本正则,扩展正则需要添加-r参数)

基本正则
# sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$/p' /etc/sysconfig/network-scripts/ifcfg-ens33 | sed -n '1p' | sed -nr 's/[A-Z=]//gp'

扩展正则
# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}$/p' /etc/sysconfig/network-scripts/ifcfg-ens33 | sed -n '1p' | sed -nr 's/[A-Z=]//gp'