编辑文本一般可使用vi,可是有时须要经过命令去编辑文件,这时就须要使用流编辑器sed正则表达式
1、sed概述
sed(stream editor的缩写),能够对标准输入流中的获得的数据进行出路,而后把处理后的结果输出到标准输出,固然标准输入和标准输出均可以重定向。
通常状况,sed只会对流经它的数据流进行处理,而不会对原文件作任何修改。若是须要作修改须要使用 -ishell
sed命令的经常使用形式:
1)从管道获取数据流
command | sed 'edit commands'缓存
2)从文件读取数据流
sed 'edit commands' filenamebash
其中edit commands是sed的一系列编辑命令,sed会根据这些命令处理数据流。filename能够是多个文件。
单引号不是必需的,这里只是标识编辑命令的开始和结束。
使用单引号,更重要的是,编辑命令中有特殊字符,须要使用特殊字符原样,防止shell解释或扩展特殊字符。为使用特殊字符原样,也可使用反斜杠\
若是要保留特殊字符的含义,如变量替换,命令替换等等,可使用双引号。编辑器
sed命令执行时,从文件或管道中的数据中,每次读取一行数据,并把数据复制到sed的工做缓存中。此处缓存称为模式空间,全部的数据都是在这里处理,
而后sed根据指定的编辑命令(edit commands)处理数据,处理完一行数据后,sed会读取下一行数据,重复执行编辑命令,直到数据被处理完为止。it
以上步骤说明:sed实际是使用相同的编辑命令对匹配到的每一行数据进行处理,直到全部行被处理完,文件或管道数据流关闭,sed命令退出。io
编辑命令格式:
/pattern/action
pattern是正则表达式,/标识正则表达式的开始和结束。使用多个edit commands时,可使用分号分隔,也可使用-e 'command',还可使用-f sed_file
如:
[root@mrhcatxq01 shell]# sed 's/2/222/g;s/0/000/g' passwdbak #使用分号分隔2个s///g命令
root:x:000:000:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:222:222:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@mrhcatxq01 shell]# sed -e 's/2/222/g' -e 's/0/000/g' passwdbak #使用-e 执行2个s///g命令
root:x:000:000:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:222:222:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@mrhcatxq01 shell]# cat filesed #每一个编辑命令占一行,若多个命令写一行须要分号分隔
s/2/222/g
s/0/000/g
[root@mrhcatxq01 shell]# sed -f filesed passwdbak #使用-f filename执行2个s///g命令
root:x:000:000:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:222:222:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologintest
2、sed常见用法
[root@mrhcatxq01 shell]# head -4 passwdbak
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
[root@mrhcatxq01 shell]#stream
1.替换 s/old/new/ 或 s/old/new/g
[root@mrhcatxq01 shell]# head -4 passwdbak | sed 's/2/test2/' #替换每行的第一次出现的2为test2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:test2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@mrhcatxq01 shell]# head -4 passwdbak | sed 's/2/test2/g' #替换每行的全部2为test2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:test2:test2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
2.插入 i
[root@mrhcatxq01 shell]# head -4 passwdbak | sed '1i #/bin/bash'
#/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
[root@mrhcatxq01 shell]#变量
3.删除和打印 (d和p)
获取数据源:
head /etc/passwd | cat -n > passwd.bak
vi passwd.bak
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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
1)删除某一行(删除第2行)
[root@mrhcatxq01 shell]# sed -e '2d' passwd.bak
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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
2)删除第n行到第m行(删除第2行到第6行)
[root@mrhcatxq01 shell]# sed -e '2,6d' passwd.bak
1 root:x:0:0:root:/root:/bin/bash
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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
3)删除全部行
[root@mrhcatxq01 shell]# sed -e 'd' passwd.bak
4)删除匹配行(以#开头)
[root@mrhcatxq01 shell]# sed -e '/^#/d' passwd.bak
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
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 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
5)打印匹配行
[root@mrhcatxq01 shell]# sed -n -e '/^#/p' passwd.bak
#3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#4 adm:x:3:4:adm:/var/adm:/sbin/nologin
#6 sync:x:5:0:sync:/sbin:/bin/sync
6)打印匹配行到匹配行(daemon到sync)
[root@mrhcatxq01 shell]# sed -n -e '/daemon/,/sync/p' passwd.bak
#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
4.使用匹配到的行 & [root@mrhcatxq01 shell]# head -4 passwdbak | sed 's/^root/#&/' #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 [root@mrhcatxq01 shell]#