shell编程——sed用法

编辑文本通常可以使用vi,但是有时需要通过命令去编辑文件,这时就需要使用流编辑器sed

一、sed概述
sed(stream editor的缩写),可以对标准输入流中的得到的数据进行出路,然后把处理后的结果输出到标准输出,当然标准输入和标准输出都可以重定向。
一般情况,sed只会对流经它的数据流进行处理,而不会对原文件做任何修改。如果需要做修改需要使用 -i

sed命令的常用形式:
1)从管道获取数据流
command | sed 'edit commands'

2)从文件读取数据流
sed 'edit commands' filename

其中edit commands是sed的一系列编辑命令,sed会根据这些命令处理数据流。filename可以是多个文件。
单引号不是必需的,这里只是标识编辑命令的开始和结束。
使用单引号,更重要的是,编辑命令中有特殊字符,需要使用特殊字符原样,防止shell解释或扩展特殊字符。为使用特殊字符原样,也可以使用反斜杠\
如果要保留特殊字符的含义,如变量替换,命令替换等等,可以使用双引号。

sed命令执行时,从文件或管道中的数据中,每次读取一行数据,并把数据复制到sed的工作缓存中。此处缓存称为模式空间,所有的数据都是在这里处理,
然后sed根据指定的编辑命令(edit commands)处理数据,处理完一行数据后,sed会读取下一行数据,重复执行编辑命令,直到数据被处理完为止。

以上步骤说明:sed实际是使用相同的编辑命令对匹配到的每一行数据进行处理,直到所有行被处理完,文件或管道数据流关闭,sed命令退出。

编辑命令格式:
/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/nologin

二、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]#

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]#

转载于:https://my.oschina.net/shw23/blog/691275

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值