sed在字符串匹配方面与grep差别不大,区别就是grep可以高亮显示,而sed不可以。sed的另一个特点就是可以实现类似于excel中的查找与替换及删除功能,配合awk的精准匹配基本可以满足大部分的数据处理,而再复杂一些的需求可以通过写shell、perl或者python脚本实现。


重要参数

  • -n打印指定行,与p一起用
  • -r开启正则表达式,等同于grep中的-E选项
  • //d 删除选项
  • -i sed的操作不会修改原文件,-i选项可以修改原文件
  • s///g 替换功能

主要功能

打印指定行

注意n要和p一起连用

1
2
3
4
5
6
7
8
9
10
11
12
#打印第一行到第五行
[lilibei@cricaas ~]$ sed -n '1,5'p /etc/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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#打印第60行到最后一行
[lilibei@cricaas ~]$ sed -n '60,$'p /etc/passwd
yudingwei:x:532:532::/home/yudingwei:/bin/bash
wanghantao:x:533:533::/home/wanghantao:/bin/bash
liuqibao:x:534:526::/home/liuqibao:/bin/bash

匹配

  • 这个功能等同于grep,区别就是不能进行高亮显示
  • 在匹配的时候同样要使用n与p连用,涉及到正则使用r
1
2
3
[lilibei@cricaas ~]$ sed -n '/root/'p /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#删除1.txt文件中的空行
[lilibei@cricaas ~]$ cat 1.txt
aaa

bbb
ccc

a
aa
[lilibei@cricaas ~]$ sed '/^$/'d 1.txt
aaa
bbb
ccc
a
aa
#删除指定行
[lilibei@cricaas ~]$ sed '1,60'd /etc/passwd
wanghantao:x:533:533::/home/wanghantao:/bin/bash
liuqibao:x:534:526::/home/liuqibao:/bin/bash
#删除3到最后一行
[lilibei@cricaas ~]$ sed '3,$'d /etc/passwd | wc -l
2

查找替换

1
2
3
4
5
6
7
sed '1,$s/nologin/JFT/g' /etc/passwd
#替换的内容中含有/符号可以使用#或者@
sed '1,$s#/sbinnolgin#JFT#g' /etc/passwd
#在最后一行中添加\tJFT
sed 's/^.*$/&\tJFT/g' /etc/passwd
#删除字母数字
sed -r 's/\w|\d//g' /etc/passwd

一些用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#打印第10行
sed -n '10'p file
#打印1-10行
sed -n '1,10'p file
#打印第10行到尾行
sed -n '10,$'p file
#匹配功能,打印含有root的行
sed -n '/root/'p file
#使用参数r支持正则
sed -nr '/ro*t/'p file
#删除空行
sed '/^$/'d file
#删除包含数字的行
sed -r '/\d/'d file
#删除包含字母的行
sed '/[A-Za-z]/'d file
#删除1-19行
sed '1,19'd file
#在原文件进行操作(不推荐使用)
sed -i '1,19'd file
#替换功能
sed '1,10s/la/lal/g' file
#整行替换为test
sed 's/.^*/test/g' file
#每一行后添加test,使用&符号
sed 's/^.*/&test/g'
#删除每一行的数字
sed -r '/\d//g'
#删除每一行的字母
sed '/[A-Za-z]/g'
#删除每一行的非字母非数字
sed -r '/\W//g'
#第一列和第十列互换
sed -r ''

注意

匹配内容的写法为’/匹配内容/‘、’s/匹配内容/替换内容/g’、’/删除内容/‘d
s/模式一/模式二/g,中的模式不支持正则表达式