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   ##直接删除空行


6,sed -r 参数实例一

[rockfall@tmp]$echo "aaa bbb "|sed -r 's/(.)/A/'
Aaa bbb
[rockfall@tmp]$echo "aaa bbb "|sed  's/(.)/A/'
aaa bbb
[rockfall@tmp]$echo "aaa bbb "|sed  's/\(.\)/A/'
Aaa bbb

实例二

一文件: test.txt,内容如下:

#---------------------------------#
abc1234567890
abc0987654321
xyz1234567890
#---------------------------------#

想输出结果:

1234567890
0987654321
1234567890


sed 命令: sed -n 's/^\([a-z]\{3\}\)\([0-9]\{3,\}\)/\2/p' test.txt 是成功的
但如果用: sed -r -n 's/^\([a-z]{3}\)\([0-9]{3,}\)/\2/p' test.txt 则提示 invalid refrence\2 on 's' commands s RHS
何解?


也可以使用 sed -n -r 's/^([a-z]{3})([0-9]{3,})/\2/p'test.txt


你都用了-r了,还给括号前加\,当然不行了,还加\的括号就代表原义括号了

总之一句话,想少用\  那你就用-r