一、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'