sed是已行为单位对文件进行操作的。
1,查找并替换
[root@90-99 oldboy]# cat test.txt
oldboy
[root@90-99 oldboy]# sed 's#oldboy#gongli#g' test.txt #me:只是修改了输出,原文件没变
gongli
#me:
s---替换,
g--全局替换,默认只替换每行第一个匹配到的
n--取消默认输出,
p--把需要的打印出来,
e--编辑,
i--直接修改文件内容(良好的操作习惯,修改之前先备份)
d---删除。
#me:如果替换后的内容为空,则是剪切,可用来做截取功能。
[root@90-99 oldboy]# sed -i 's#oldboy#gongli#g' test.txt #me: -i参数是直接修改文件
[root@90-99 oldboy]# cat test.txt
gongli
2,正则替换的时候,\s表示一个空格或者TAB键
[root@robin shell]# cat robin.txt
1 aa
2 b
3 c
删除文中的所有空格或tab键
[root@robin shell]# sed 's#\s##g' robin.txt
1aa
2b
3c
如果不加g参数,那么2和b直接的多个空格只能删除一个。
3,
1)sed '/a/d;/b/d;s/3/4/g' robin.txt ##删除包含aa字符串的行,同时删除包含b字符串的行,同时将剩余行中的3替换为4(打印出操作之后的内容,并未真正修改文件)
2)sed -i "/aa/d" robin.txt ##真正删除文件中的内容,sed的工作原理以行为单位
3)sed -n "20,30p" robin.txt ##查看第20行至30行的内容 或者 head + tail 配合
4)sed 结合正则匹配指定字符串
[wuxy@90-99 ~]$ cat oldboy.txt
i am oldboy teacher
[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) tea.*$#\1#g' oldboy.txt
oldboy
如果不对括号进行转义就使用sed的 -r 参数,命令如下
[wuxy@90-99 ~]$ sed -r 's#^i.*m ([a-z]*) tea.*$#\1#g' oldboy.txt
[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) cher$#\1#g' oldboy.txt
i am oldboy teacher ####这个前2个#中的未能完全匹配,该行,则 \1 代表的是整个行
[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) t.*r$#\1#g' oldboy.txt
oldboy ####这个前2个#中的完全匹配改行,则 \1 代表的是第一个括号的内容
[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) .*cher$#\1#g' oldboy.txt
oldboy
5)要求:取第四行中显示的权限664
[root@90-99 wuxy]# stat test.sh
File: `test.sh'
Size: 50 Blocks: 8 IO Block: 4096 regular file
Device: ca02h/51714d Inode: 664577 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 504/ wuxy) Gid: ( 504/ wuxy)
Access: 2014-11-21 14:31:26.772089730 +0800
Modify: 2014-09-28 14:59:34.276001952 +0800
Change: 2014-09-28 14:59:34.320002207 +0800
[root@90-99 wuxy]# stat test.sh | sed -n '4p' #me:取第四行
Access: (0664/-rw-rw-r--) Uid: ( 504/ wuxy) Gid: ( 504/ wuxy)
[root@90-99 wuxy]# stat test.sh | sed -n '4p' | sed 's#^.*(0##g' #me:截掉前面
664/-rw-rw-r--) Uid: ( 504/ wuxy) Gid: ( 504/ wuxy)
[root@90-99 wuxy]# stat test.sh | sed -n '4p' | sed 's#/-r.*##g' #me:截掉后面
Access: (0664
[root@90-99 wuxy]# stat test.sh | sed -n '4p' | sed 's#^.*(0##g'|sed 's#/-r.*##g'
664 #me:先截掉前面,再截掉后面,剩余的就是664
另外一种直接截取的方法:
[root@90-99 wuxy]# stat test.sh | sed -n '4p' | sed 's#^.*(0\([0-9]\+\).*$#\1#g'
664 #me:注意 + 必须要转义!如果使用 * ,则不用转义 {0,} 等价于 *
命令如下:
[root@90-99 wuxy]# stat test.sh | sed -n '4p' | sed 's#^.*(0\([0-9]*\).*$#\1#g'
或者
[root@90-99 wuxy]# stat test.sh | sed -n '4p' | sed 's#^.*(0\([0-9]\{1,\}\).*$#\1#g'
664 #me:注意 { } 必须要转义 {1,} 等价于 +
或者
[root@90-99 wuxy]# stat test.sh | sed -n 's#^.*(0\([0-9]\+\).*$#\1#gp'
664 #me:去除了匹配第4行
或者
[root@90-99 wuxy]# stat test.sh | sed -n 's#^.*(0\([0-9]*\).*$#\1#gp'
664 #me:.* 匹配具有贪婪行
以上仅是联系,最简单的方法在这里!!!
[root@90-99 wuxy]# stat test.sh | sed -n '4p' | awk -F"[(/]" '{print $2}'| cut -c 2-4
664
4,在每行的开始添加字符串或者空格
chkconfig --list | grep "3:on" | awk '{print $1}'| sed 's#^#chkconfig #g'
既在每行的开始添加字段,又在每行的结尾添加字段
chkconfig --list | grep "3:on" | awk '{print $1}'| sed 's#\(.*\)#chkconfig \1 off#g'
\(.*\) 这个匹配的括号必须要转义,否则报错!或者sed使用 -r 参数,同样可以。如下
chkconfig --list | grep "3:on" | awk '{print $1}'| sed -r 's#(.*)#chkconfig \1 off#g'
5,打印包含指定字符串的行
[root@robin robin]# ifconfig eth1 | sed -n '/inet addr/p'
inet addr:192.168.90.96 Bcast:192.168.90.255 Mask:255.255.255.0
5,用sed过滤掉空行
sed '/^$/d' robin.txt
sed -i '/^$/d' robin.txt ##直接删除空行