Sed是一种流编辑器,过滤和替换文本
工作原理:
简单的来说,Sed一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称之为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行。直到文件末尾。
语法:
sed [option] [script'(sed自带语法脚本)] [input-file处理的文件]
sed [选项] + "地址+命令 " file
常用option参数(+描述):
--help: | 获取帮助信息; |
-n: | 不输出模式空间内容到屏幕,即不自动打印,配合编辑命令只打印符合条件字符串; |
-e: | 多点编辑,可添加多个脚本; |
-f: | /PATH/SCRIPT_FILE,从指定文件中读取编辑脚本; |
-i: | 原文件编辑(直接修改原处理文件),不添加-i参数,不会对原文件进行修改; |
-r : | 支持使用扩展的正则表达式; |
Script:
地址+命令
地址:
1.不给地址:对全文进行处理;
2.单地址:
#:指定的行(1p,2p...)
/pattern/:被模式匹配匹配到的字串行
3.范围地址:
#,#:第几行只第几行(1,2p)
#,+#:从第#行起始向后+#行
/pat1/,/pat2/:模式1匹配 所在行至模式2匹配所在行
#,/pat/:第几行只模式匹配行
4.~:步进
1~2:奇数行
2~2:偶数行
编辑命令:
d: | 删除模式空间匹配的行; |
p: | 显示模式空间中的内容; |
a \text: | 在指定行后追加文本,支持使用\n多行追加文本; |
i \test: | 在行前面插入文本,支持使用\n实现多行插入; |
c \test: | 替换行为单行或多行文本; |
w /PATH/Somefile: | 保存模式匹配的行至指定文件; |
r /PATH/Somefile: | 读取指定文件的文本至模式空间中匹配到的行后; |
=: | 为模式空间中的行打印行号; |
!: | 模式空间中匹配行取反操作; |
sed查找替换:
s///:查找替换,只是吃用其他分隔符:
s@@@
s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /PATH/TO/Somefile:将替换成功的行报错至文件中
操作原文件:
[root@GaoServer ~]# cat -n Test.txt 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin
匹配打印(p):
#打印匹配root开头的行: #每一行都读到模式空间,不加-n参数默认进行输出,这里看到root:x:0:0:root:/root:/bin/bash输出两行 [root@GaoServer ~]# cat Test.txt | sed '/^root/p' root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@GaoServer ~]# tail Test.txt | sed -n '/^root/p' root:x:0:0:root:/root:/bin/bash #打印包含root的行: [root@GaoServer ~]# cat -n Test.txt | sed -n '/root/p' 1 root:x:0:0:root:/root:/bin/bash 10 operator:x:11:0:operator:/root:/sbin/nologin #打印第二行: [root@GaoServer ~]# cat -n Test.txt | sed -n '2p' 2 bin:x:1:1:bin:/bin:/sbin/nologin [root@GaoServer ~]# #打印第一行到,第三行: [root@GaoServer ~]# cat -n Test.txt | sed -n '1,3p' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin #打印第三行起始后三行: [root@GaoServer ~]# cat -n Test.txt | sed -n '3,+3p' 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync #打印以nologin结尾的行:(匹配) [root@GaoServer ~]# cat -n Test.txt | sed -n '/nologin$/p' 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin #打印root开头行至daemon开头行 [root@GaoServer ~]# sed -n '/^root/,/^daemon/p' Test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin #打印最后一行 [root@GaoServer ~]# cat -n Test.txt | sed -n '$p' 10 operator:x:11:0:operator:/root:/sbin/nologin #不打印最后一行:(“!”表示取反) [root@GaoServer ~]# cat -n Test.txt | sed -n '$!p' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #打印奇数行 [root@GaoServer ~]# cat -n Test.txt |sed -n '1~2p' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #打印偶数行 [root@GaoServer ~]# cat -n Test.txt |sed -n '2~2p' 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 10 operator:x:11:0:operator:/root:/sbin/nologin #引用变量:sed命令使用单引号:变量用单引号引起来,sed命令使用双引号,解释特殊符号原有意义 [root@GaoServer ~]# a=1 [root@GaoServer ~]# b=2 [root@GaoServer ~]# cat -n Test.txt | sed -n ''$a','$b'p' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin [root@GaoServer ~]# cat -n Test.txt | sed -n "$a,"$b"p" 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin
匹配删除(d):
#删除匹配root行 [root@GaoServer ~]# cat -n Test.txt | sed '/root/d' 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #删除第二行 [root@GaoServer ~]# cat -n Test.txt | sed '2d' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin #删除1至9行 [root@GaoServer ~]# cat -n Test.txt | sed '1,9d' 10 operator:x:11:0:operator:/root:/sbin/nologin #删除偶数行 [root@GaoServer ~]# cat -n Test.txt | sed '2~2d' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#删除配置文件中以(#开头的行和空行) [root@GaoServer ~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
替换(s///):
#替换root字符串为ROOT,s///:只是替换每行中第一个匹配到的字符串 [root@GaoServer ~]# cat -n Test.txt | sed 's/root/ROOT/' 1 ROOT:x:0:0:root:/root:/bin/bash #第一行中只有第一个root替换成ROOT 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/ROOT:/sbin/nologin #唯一一个root #全局替换root字符串为ROOT,s///g [root@GaoServer ~]# cat -n Test.txt | sed 's/root/ROOT/g' 1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/ROOT:/sbin/nologin #正则匹配 [root@GaoServer ~]# sed -n 's/^root/ROOT/p' Test.txt ROOT:x:0:0:root:/root:/bin/bash #分组使用:取出基本名,目录名 [root@GaoServer ~]# dirname /etc/sysconfig/sshd /etc/sysconfig [root@GaoServer ~]# basename /etc/sysconfig/sshd sshd [root@GaoServer ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#\1#' /etc/sysconfig/ [root@GaoServer ~]# echo "/etc/sysconfig/sshd" | sed -r 's#(/.*/)([^/]+/?)#\2#' sshd #使用&命令引用匹配内容并且替换, #注:&代表root,&.1:把root替换成root.1 [root@GaoServer ~]# cat -n Test.txt |sed 's/root/&.1/g' 1 root.1:x:0:0:root.1:/root.1:/bin/bash ...... #为1,2行添加注释 [root@GaoServer ~]# cat -n Test.txt |sed '1,2s/^/#/' # 1 root:x:0:0:root:/root:/bin/bash # 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
多点编辑(-e):
[root@GaoServer ~]# cat -n Test.txt |sed -e '4,5d' -e 's/root/ROOT/g' 1 ROOT:x:0:0:ROOT:/ROOT:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/ROOT:/sbin/nologin
添加/追加内容(a,i,c):
#i:在搜索匹配到的上一行添加 [root@GaoServer ~]# cat -n Test.txt | sed '/root/i \Root' Root 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin ...... #a:在搜索匹配的下一行添加 [root@GaoServer ~]# cat -n Test.txt | sed '/root/a \Root' 1 root:x:0:0:root:/root:/bin/bash Root 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ...... #c:替换搜索匹配的行 [root@GaoServer ~]# cat -n Test.txt | sed '/root/c \Root' Root 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin ......
注:同样可以指定地址单行添加,指定地址范围添加......
保存模式匹配的行至指定文件(w):
#匹配1,2行追加Test1 [root@GaoServer ~]# cat -n Test.txt | sed '1,2w Test1' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin [root@GaoServer ~]# cat Test1 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin
读取指定文件的文本追加至模式空间(r):
#读取/etc/redhat-release,追加至1,2行 [root@GaoServer ~]# cat -n Test.txt | sed '1,2r /etc/redhat-release' 1 root:x:0:0:root:/root:/bin/bash CentOS Linux release 7.2.1511 (Core) 2 bin:x:1:1:bin:/bin:/sbin/nologin CentOS Linux release 7.2.1511 (Core) 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
匹配到的行号:
#=: [root@GaoServer ~]# cat -n Test.txt | sed -n '/root/=' 1 10
原文件编辑(i):
[root@GaoServer ~]# sed -i 's/adm/ADM/g' Test.txt [root@GaoServer ~]# cat Test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ADM:x:3:4:ADM:/var/ADM:/sbin/nologin ......
注意:由于-i参数修改原配置文件,操作比较危险,可以使用-i.bak执行,生成源文件.bak就是之前没有改动的文件(bak是自己制定,随意指定)。
[root@GaoServer ~]# sed -i.bak '1,7d' Test.txt [root@GaoServer ~]# cat Test.txt halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@GaoServer ~]# cat Test.txt.bak #原文件备份 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ADM:x:3:4:ADM:/var/ADM:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
空间操作:
n: | 读取匹配到的行的下一行覆盖至模式空间; |
N: | 读取匹配到的行的下一行追加至模式空间; |
h: | 模式空间中内容覆盖至保持空间中; |
H: | 模式空间中的内容追加至保持空间中; |
g: | 从保持空间取出数据覆盖至模式空间; |
G: | 从保持空间取出内容追加至模式空间; |
d: | 删除模式空间中的行; |
D: | 删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,对剩余模式空间重新执行sed; |
x: | 模式空间中内容与保持空间内容进行互换; |
#取出偶数行: [root@GaoServer ~]# cat -n Test.txt | sed -n 'n;p' 2 bin:x:1:1:bin:/bin:/sbin/nologin 4 ADM:x:3:4:ADM:/var/ADM:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 8 halt:x:7:0:halt:/sbin:/sbin/halt 10 operator:x:11:0:operator:/root:/sbin/nologin #取出奇数行: [root@GaoServer ~]# cat -n Test.txt | sed 'n;d' 1 root:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#倒叙显示: [root@GaoServer ~]# cat -n Test.txt |sed -n '1!G;h;$p' 10 operator:x:11:0:operator:/root:/sbin/nologin 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 8 halt:x:7:0:halt:/sbin:/sbin/halt 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 6 sync:x:5:0:sync:/sbin:/bin/sync 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 2 bin:x:1:1:bin:/bin:/sbin/nologin 1 root:x:0:0:root:/root:/bin/bash
#打印文件最后一行: [root@GaoServer ~]# sed 'N;D' Test.txt operator:x:11:0:operator:/root:/sbin/nologin
#在每行后增加空行: [root@GaoServer ~]# sed 'G' Test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ......
转载于:https://blog.51cto.com/gning/1962336