sed行文本处理工具

2018-01-29 08:26:01来源:cnblogs.com作者:Gning人点击

分享

工作原理:

简单的来说,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/bashroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator: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/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon: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=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=NOlisten_ipv6=YESpam_service_name=vsftpduserlist_enable=YEStcp_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/bashRoot     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/bashCentOS Linux release 7.2.1511 (Core)      2 bin:x:1:1:bin:/bin:/sbin/nologinCentOS 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/='110#!:同之前可以

原文件编辑(i):

[root@GaoServer ~]#  sed -i 's/adm/ADM/g' Test.txt[root@GaoServer ~]# cat Test.txt root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinADM: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.txthalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[root@GaoServer ~]# cat Test.txt.bak        #原文件备份root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinADM:x:3:4:ADM:/var/ADM:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator: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.txtoperator: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 ......

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台