在linux的学习和使用中,sed,awk,grep的用法的重要性不言而喻,本文从以下几个方面小结了sed的用法:
1、sed的含义
sed 是stream editor;就是流编辑器,和我们用到的vi是不同的,vi是全屏编辑器。而且sed是逐行将文件内容取入到内存,进过sed中指定命令进行处理,然后输出到屏幕的。
2、sed的用法及格式
sed [options] ‘StartAdd,EndAddCommand‘ files,...
[options] 指的是sed的选项。可以省略
StartAdd,EndAdd 指的sed中地址的表示方法
Command指的是sed的处理命令。
files,..可以是多个,是sed的处理对象。即把那个文件放入内存,然后逐行处理的。
3、地址的表示方式
‘1,3p‘ passwd #表示的含义是,打印passwd文件1到第三行。绝对行数表示法
[root@localhost testdir]# sed -n ‘1,3p‘ passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
‘1,+3p‘ passwd #表示的含义是:打印第一行及后面的三行的内容。相对行数表示法
[root@localhost testdir]# sed -n ‘1,+3p‘ passwd
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
‘36,$p‘ passwd #表示打印从38行到最后一行的passwd的内容 $表示最后一行
[root@localhost testdir]# sed -n ‘36,$p‘ passwd
user1:x:504:504::/home/user1:/bin/bash
user2:x:505:505::/home/user2:/bin/bash
user3:x:506:506::/home/user3:/bin/bash
‘/pattern/Command‘ #表示匹配到patern的行打印,pattern可以是正则表达式
[root@localhost testdir]# sed -n ‘/^root/p‘ passwd
root:x:0:0:root:/root:/bin/bash
rootbisu:x:500:500:centos_X641:/home/rootbisu:/bin/bash
‘/pattern1/,/pattern2/Command‘ 用command处理/pattern1/首次匹配到的行,到/pattern2/首次匹配到的行的内容
[root@localhost testdir]# sed -n ‘/^\<root\>/,/^\<bin\>/p‘ passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sed ‘3p‘ passwd # 表示打印passwd的第三行
[root@localhost testdir]# sed -n ‘3p‘ passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4、sed中命令及参数的用法
sed既然作为一个流编辑器,那么他的主要命令功能应该体现在编辑上。常见的编辑操作有,打印,删除,替换,添加等操作。
d:表示删除符合条件的行
p:表示打印符合条件的行
a:表示在符合条件的行后,格式:a\string 追加新的内容a是append # a后是什么输出什么。 [root@localhost testdir]# sed ‘/^\<root\>/a\appendtest‘ passwd
root:x:0:0:root:/root:/bin/bash
appendtest
i:insert ,表在符合条件的行前,插入新的string.格式i\string
[root@localhost testdir]# sed ‘/^\<root\>/i\appendtest‘ passwd
appendtest
root:x:0:0:root:/root:/bin/bash
r:read ,rfile表示在符合条件的行的后面将read的file的内容附加
[root@localhost testdir]# sed ‘/^\<root\>/rgrep.txt‘ passwd
root:x:0:0:root:/root:/bin/bash
This is root
The user is mroot
rooter is a dog‘s name.
Mrooter is not a word
bin:x:1:1:bin:/bin:/sbin/nologin
w:write,wfile表示将符合条件的行写至file中
[root@localhost testdir]# sed -n ‘/^\<root\>/wgrep.txt‘ passwd
[root@localhost testdir]# cat grep.txt
root:x:0:0:root:/root:/bin/bash
s表示查找并替换 # 替换第一次匹配到的项
[root@localhost testdir]# sed ‘s/root/ROOT/‘ passwd
ROOT:x:0:0:root:/root:/bin/bash
# 加上参数g表示替换所有匹配到项
[root@localhost testdir]# sed ‘s/root/ROOT/g‘ passwd
ROOT:x:0:0:ROOT:/ROOT:/bin/bash
5、常用的参数:
-n:表示静默模式,只输出处理了的行,其他的不输出
-i:会将command的结果作用到被处理的文件上
-r:表示pattern中可以使用扩展正则表达式
-e: 表示可以使用多个命令。sed -e ‘10,11p‘ -e ‘12,13d‘
6、sed用法的小结及注意事项
sed的用法非常关键,需要牢记,sed的用法及格式,地址的表示方法,和常用的命令,以及命令的参数,此处还有需要注意的细节是,可以在sed中使用后项引用。
有一个文本内容如下:
he like his like
she love her love
he like his love
she love his like
有一个需求,想把like变成liker,想把love变成lover应该怎么处理?这个时候可以使用后项引用了。
[root@localhost testdir]# sed ‘s/\(l..e\)/\1r/g‘ test
he liker his liker
she lover her lover
he liker his lover
she lover her liker
[root@localhost testdir]# sed ‘s/\(l..e\)/\(l,,e\)r/g‘ test
he (l,,e)r his (l,,e)r
she (l,,e)r her (l,,e)r
he (l,,e)r his (l,,e)r
she (l,,e)r her (l,,e)r
注意,我们发现,‘s/string1/string2/g‘ 其中string可以是正则表达式,如果是用了-r选项,那么还可以使用扩展正则表达式,但是string2是不能使用正则表达式的。
原文地址:http://hongyilinux.blog.51cto.com/8030513/1705288