美文网首页
sed使用技巧

sed使用技巧

作者: hch004 | 来源:发表于2018-01-17 10:37 被阅读0次

sed工具

sed工具的用法有很多地方和grep相似,但是grep实现的只是查找而不能替换,sed工具则可以这么操作。

打印某行格式为;sed -n 'n'p filename (n表示任意数字)

[root@hch sed]# sed -n '2'p test.txt

bin:x:1:1:bin:/bin:/sbin/nologin

要想把所有行都打印出来,可以使用;sed -n '1,$'p filename ($表示默认匹配到末尾)

[root@hch sed]# sed -n '1,$'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

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

也可以指定一个区间打印;sed -n'1,3'p filename

[root@hch sed]# sed -n '1,3'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

打印包含某个字符串的行;sed -n '/内容字符串/'p filename

[root@hch sed]# sed -n '/root/'p test.txt

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[root@hch sed]# sed -n '/r.t/'p test.txt

operator:x:11:0:operator:/root:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

这里正则的用法就和grep很相似了,比如特殊字符(^、$、.、*等)这些在sed中同样能使用

以下逐一示范

[root@hch sed]# sed -n '/^b/'p test.txt

bin:x:1:1:bin:/bin:/sbin/nologin

[root@hch sed]# sed -n '/in$/'p test.txt //显示文件内容中所有含有in字符串的行

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin 

[root@hch sed]# sed -n '/r..o/'p test.txt

operator:x:11:0:operator:/root:/sbin/nologin

polkitd:x:998:996:User for polkitd:/:/sbin/nologin

[root@hch sed]# sed -n '/oo*/'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

sed命令上加上-e参数可以实现多个行为操作

[root@hch sed]# sed -e '1'p -e '/111/'p -n test.txt

root:x:0:0:root:/root:/bin/bash

111111111111111:222222222222

删除某些行

这里删除的意思只是指在打印显示在屏幕上的内容,非文件里的实际内容

[root@hch sed]# sed '1,40'd test.txt //意思为删除1到40行的内容至显示剩余的行

[root@hch sed]# sed '/root/'d test.txt //删除已root开头的行,显示剩余的行

[root@hch sed]# sed -i '1,10'd test.txt //-i删除源文件1-10行

替换字符或者字符串

sedgrep强大的地方就在于替换,以下先示范一个

[root@hch sed]# sed '1,10s/root/toor/g' test.txt

toor:x:0:0:toor:/toor:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

[root@hch sed]# sed -r '1,10s/ro+/r/g' test.txt

rt:x:0:0:rt:/rt:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

可以看到ot被替换成了to,这里s表示替换的动作,g表示本行全局替换,使用方法和vim里的如出一辙

分隔符出了使用“/”外还可以使用其它的特殊符号来替代,例如#@,在遇到会将“/”符号包括在内的操作时就可以使用别的特殊符号来替代原本的“/”

示例;

[root@hch sed]# sed 's#ot#to#g' test.txt

roto:x:0:0:roto:/roto:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

111111111111111:222222222222

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

删除文档中的所有数字或者字母

[root@hch sed]# sed 's/[0-9]//g' test.txt //设定0-9的取值范围替换值为空则表示删除,字母同理

[root@hch sed]# sed 's/[a-zA-Z]//g' test.txt

调换两个字符串的位置

调换也是sed工具的一强大功能

[root@hch sed]# head test.txt |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

111111111111111:222222222222

/sbin/nologin:x:2:2:daemon:/sbin:daemon

/sbin/nologin:x:3:4:adm:/var/adm:adm

/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp

/bin/sync:x:5:0:sync:/sbin:sync

/sbin/shutdown:x:6:0:shutdown:/sbin:shutdown

/sbin/halt:x:7:0:halt:/sbin:halt

/sbin/nologin:x:8:12:mail:/var/spool/mail:mail

小括号在sed中属于特殊符号,必须在前面加脱义字符“\”或者使用“-r”参数,否则无效,上例中用()把想要替换的字符打包成一个整体,替换时写成\3\2\1,当然你也可以调换以下次序\2\3\1

[root@hch sed]# head test.txt |sed -r 's/(.*)/aaa:&/'

aaa:root:x:0:0:root:/root:/bin/bash

相关文章

网友评论

      本文标题:sed使用技巧

      本文链接:https://www.haomeiwen.com/subject/pjeyoxtx.html