sed是一种流编辑器,主要针对文本行进行处理,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
主要功能为主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
工作原理:在内存中申请两个个空间,分别叫做模式空间和保持空间,基本用法采用模式空间进行对每一个行进行处理,利用用户定义的pattern对读取到模式空间的每一进行处理并将处理结果默认打印到屏幕。高级用法使用模式空间和保持空间共同处理完成高级作业。
Sed的基本语法为sed [option]scripts file,具体选项、地址定界、编辑命令和处理目标文件等,另外sed取字段或其他内容时,通常采用分组替换思路解决问题,具体如下所示:
命令 |
选项 |
Scripts |
File |
|
Sed |
[nefri] |
地址定界 |
编辑命令 |
目标文件 |
选项介绍:
-n:关闭命令本身默认输出的内容,仅输出经过利用用户自定义的pattern进行对pattern空间处理每一个行文本后的动作,即地址定界+编辑命令的结果。
-e:多点编辑,同时可以多每一行进行多次编辑
-f:从指定文件中读取编辑脚本
-r:启用扩展正则表达式
-i.bak:备份文件并原处编辑
实例演示:-n关闭默认输出的信息
[[email protected] ~]#ifconfig ens33|sed ‘/netmask/p‘ #验证默认输出+模式匹配动作 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.129 netmask 255.255.255.0 broadcast 192.168.100.255 inet 192.168.100.129 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::20c:29ff:fecf:ed55 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:cf:ed:55 txqueuelen 1000 (Ethernet) RX packets 16075 bytes 1508980 (1.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 12329 bytes 2347525 (2.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [[email protected] ~]#ifconfig ens33|sed -n ‘/netmask/p‘ #验证关闭默认输出 inet 192.168.100.129 netmask 255.255.255.0 broadcast 192.168.100.255 [[email protected] ~]#sed -i ‘/SELINUX=/c\SELINUX=disabled‘ /etc/selinux/config [[email protected] ~]#cat /etc/selinux/config #利用sed关闭selinux # This file controls the state of SELinux on the system. SELINUX=disabled # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted [[email protected] ~]#sed -n -e ‘/^root\>/p‘ -e ‘s/root/rooter/gp‘ p root:x:0:0:root:/root:/bin/bash #第一个e是全文匹配出来以root开 rooter:x:0:0:rooter:/rooter:/bin/bash 行打印出来头的 operator:x:11:0:operator:/rooter:/sbin/nologin #第二个e是全文再次搜索替换 #在有两个e时,每一个e都是对全文进行操作 ifconfig ens33|sed -n -e ‘2s/^.*inet //‘ -e ‘2s/ .*$//p‘ 192.168.100.129 #此时同时对第2行进行模式处理并打印 |
命令ifconfig ens33本身默认有信息在屏幕上输出,另外文本的每一行逐一被调度到模式空间中被定义的‘/netmask/p‘处理,pattern匹配到有netmask的行打印,故实例中匹配到netmask行显示两行,其中1行是默认输出的信息,另外一行是经过pattern处理后打印出的信息。如若关闭默认输出时,则只显示pattern处理的信息。
地址定界:
地址定界 |
含义 |
|
不给地址 |
对全文进行处理 |
|
单地址 |
# |
指定的行 |
/pattern/ |
被此处模式所能匹配到的每一行 |
|
地址范围 |
#,# |
从多少行到多少行 |
#,+# |
从多少行到加多少行 |
|
/part/,/part/ |
从模式所匹配到的行再到模式匹配到的行(文本中的每一行都要进入模式空间进行处理) |
|
#,/part/ |
从多少行到模式所能匹配到的行 |
|
~进步 |
1~2 |
从第一行+2行,依次类推一直向上叠加,即显示奇数行 |
2~2 |
从第二行+2行,依次类推一直向上叠加,即显示偶数行 |
编辑命令:
D |
删除模式空间匹配到的行,并立即进入下一轮的循环 |
P |
打印当前模式空间内容,追加到默认输出之后 |
a[\]text |
指定行后面追加文本,支持使用\n实现多行追加 |
i[\]text |
指定行前面追加文本,支持使用\n实现多行追加 |
c[\]text |
替换模式匹配到的行 |
w/path/somefile |
保存模式匹配到的行到某文件 |
r/path/somefile |
读取文件指定的行到模式空间进行处理 |
= |
打印模式匹配到行的行号 |
! |
模式空间中匹配行取法处理 |
s///,[email protected]@@,s### |
查找替换,如s/1234/abcd/,查找到1234替换为abcd, |
替换标记g:全局替换 p;打印替换成功的行 w/path/TO/somefile 保存替换的行到文件中 |
实例演示:
[[email protected] ~]#sed -n ‘/^root\>/s/^/#/p‘ /etc/passwd #root:x:0:0:root:/root:/bin/bash #对正则表达式匹配出来后进行进行增加#注释 [[email protected] ~]#sed -rn ‘s/(^root)/\101/p‘ p root01:x:0:0:root:/root:/bin/bash#利用扩展正则表达式对文本进行搜索替换 [[email protected] ~]#sed -i.bak ‘/^# Source/i\alias vname="vim /etc/sysconfig/network"‘ .bashrc #利用正则表达式在# Source开头的行前添加别名 [[email protected] ~]#cat .bashrc #验证说明可以实现此项功能 # .bashrc # User specific aliases and functions alias rm=`echo rm can not use` alias cp=‘cp -i‘ alias vname="vim /etc/sysconfig/network" # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi [[email protected] ~]#sed -i.bak ‘2i\This is my alias name‘ .bashrc [[email protected] ~]#cat .bashrc #在第2行前增加注释 # .bashrc This is my alias name # User specific aliases and functions alias vname="vim /etc/sysconfig/network" descript good # Source global definitions alias vname="vim /etc/sysconfig/network" if [ -f /etc/bashrc ]; then . /etc/bashrc Fi [[email protected] ~]#ifconfig ens33|sed -e ‘2!d;s/.*inet //;s/ .*$//‘ 192.168.100.129 #封号表示顺序执行,除第2行的删除继续pattern处理 取父目录名或取基名,选组1则是父目录名,选组2则是基名 [[email protected] /media/Packages]#ls |sed -r -n ‘s/^.*[.]([^.]+).rpm/\1/p‘|sort|uniq –c #取镜像中.rpm包的分类个数 2000 i686 2938 noarch 4069x86_64 [[email protected] /media/Packages]#cat/etc/init.d/functions | sed -r ‘s/[^[:alpha:]]+/\n/g‘|sort|uniq –c #取文件中的单词个数,思路是:非单词换行最后统计 |