sed

  • sed

sed(Stream Editor),流编辑器,对标准输出或文件逐行进行处理。

  • 语法形式
语法 说明
sedout|sed [option] “pattern command” pattern 匹配模式
sed [option] “pattern command” file command 操作命令
  • sed的选项
选项 含义
-n 只打印匹配行
-e 直接在命令行进行sed编辑,默认选项
-f 编辑动作保存在文件中,指定文件执行
-r 支持拓展正则表达式
-i 直接修改文件内容
  • pattern用法表
匹配模式 含义
10command 匹配第10行
10,20command 匹配第10行开始,到第20行结束
10,+5command 匹配第10行开始,到第15行结束
/pattern1/command 匹配到pattern1的行
/pattern1/,/pattern2/command 匹配到pattern1的行开始,到匹配到pattern2行结束
10,/pattern1/command 匹配第10行开始,到匹配到pattern1行结束
/pattern1/,10command 匹配到pattern1的行开始,到第10行结束
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
shell > cat num
a1
b2
c3
d4
b5
e6
f7
g8
h9
i10
j11
k12
l13
m14
n15
o16
p17
q18
r19
s20
shell > sed -n '10p' num
i10
shell > sed -n '10,13p' num
i10
j11
k12
l13
shell > sed -n '10,+5p' num
i10
j11
k12
l13
m14
n15
shell > sed -n '/a/p' num
a1
shell > sed -n '/a/,/c/p' num
a1
b2
c3
shell > sed -n '4,/f/p' num
d4
b5
e6
f7
shell > sed -n '/f/,9p' num
f7
g8
h9
  • sed 编辑命令对照表
类别 编辑命令 含义
查询 p 打印
查询 = 查询行号
增加 a 行后增加
增加 i 行前增加
增加 r 外部文件读入,行后追加
增加 w 匹配行写入外部文件
删除 d 删除
修改 s/old/new/ 行内第一个old替换为new
修改 s/old/new/g 将行内所有old替换为new
修改 s/old/new/2g 将行内从第二个开始到最后的old替换为new
修改 s/old/new/2 将行内从第二个old替换为new
修改 s/old/new/ig 将行内所有old替换为new,忽略大小写
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
shell > cat str.base 
i love linux and you LOVE liux too
i love love love love love you
i like linux
################
shell > cp -f str.base str.txt ; sed -n '/love/p' str.txt
i love linux and you LOVE liux too
i love love love love love you
shell > cp -f str.base str.txt ; sed -n '/love/=' str.txt
1
2
################
shell > cp -f str.base str.txt ; sed -i '/love/i1' str.txt ; cat str.txt
1
i love linux and you LOVE liux too
1
i love love love love love you
i like linux
shell > cp -f str.base str.txt ; sed -i '/love/a1' str.txt ; cat str.txt
i love linux and you LOVE liux too
1
i love love love love love you
1
i like linux
shell > cat add.txt
aaa
shell > cp -f str.base str.txt ; sed -i '/love/radd.txt' str.txt ; cat str.txt
i love linux and you LOVE liux too
aaa
i love love love love love you
aaa
i like linux
shell > cp -f str.base str.txt ; sed -i '/love/wnew.txt' str.txt ; cat new.txt
i love linux and you LOVE liux too
i love love love love love you
################
shell > cp -f str.base str.txt ; sed -i '/love/d' str.txt ; cat str.txt
i like linux
################
shell > sed 's/love/ai/' str.base
i ai linux and you LOVE liux too
i ai love love love love you
i like linux
shell > sed 's/love/ai/g' str.base
i ai linux and you LOVE liux too
i ai ai ai ai ai you
i like linux
shell > sed 's/love/ai/2g' str.base
i love linux and you LOVE liux too
i love ai ai ai ai you
i like linux
shell > sed 's/love/ai/2' str.base
i love linux and you LOVE liux too
i love ai love love love you
i like linux
shell > sed 's/love/ai/ig' str.base
i ai linux and you ai liux too
i ai ai ai ai ai you
i like linux
  • 反向引用

& \1 可以引用模式匹配到的整个串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
shell > sed -i 's/love/&s/g' str.base ; cat str.base
i loves linux and you LOVE liux too
i loves loves loves loves loves you
i like linux

#&可以引用匹配到的整个串
shell > sed -i 's/l...s/&AAA/g' str.base ; cat str.base
i lovesAAA linux and you LOVE linux too
i lovesAAA lovesAAA lovesAAA lovesAAA lovesAAA you
i like linux

#\1可以引用整个串,也可以引用部分。所有需要反向引用的部分,需要使用\(\)扩起来。
shell > sed -i 's/\(l...s\)AAA/\1BBB/g' str.base ; cat str.base
i lovesBBB linux and you LOVE linux too
i lovesBBB lovesBBB lovesBBB lovesBBB lovesBBB you
i like linux
shell >