首页 >> 学习 >> Linux常用命令 >> sed
sed命令

本节重要性:★★★★☆    本节难度:★★★★★

sed是著名的流编辑器(Stream Editor)。与我们日常接触的全屏编辑器不同,流编辑器每次处理一行。处理时,把当前处理的行存储在临时缓冲区中,然后用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容输出到屏幕,接着处理下一行。这样不断重复,直至文件末尾。用sed处理文本时,原文件的内容并不会改变。

命令用途

流编辑器,用于过滤或修改文本

命令格式

sed [option(s)] 'command' file(s)

sed [option(s)] -f script_file file(s)

常用选项

-n		不输出缓冲区的内容
-e		添加运行一次sed执行的命令(一次执行多个命令,每个-e后跟一个命令)
-f script_file	从脚本文件script_file读取要执行的命令

常见用法

在正式学习sed的用法之前,我们先看一个例子:

[peter@ibi98 sed]$ cat demo_sed
1 animal
2 plant
3 fungi
4 protist
5 eubacteria
6 archaea
[peter@ibi98 sed]$ sed 'p' demo_sed
1 animal
1 animal
2 plant
2 plant
3 fungi
3 fungi
4 protist
4 protist
5 eubacteria
5 eubacteria
6 archaea
6 archaea
[peter@ibi98 sed]$ sed '1p' demo_sed
1 animal
1 animal
2 plant
3 fungi
4 protist
5 eubacteria
6 archaea
[peter@ibi98 sed]$ sed -n '1p' demo_sed
1 animal

demo_sed文件里有6行,'p'是sed命令里的打印(print)操作,不指定打印范围就把所有内容打印出来。因为sed默认就是打印缓冲区的内容,再用p操作就会每一行打印两次。如果用-n选项,sed不打印缓冲区内容,再用p操作就打印指定内容,'1p'就是打印第1行。

综上,sed命令包括操作范围操作符两部分。

一、操作范围语法

1. 绝对地址

绝对地址的语法为:n[,m](n,m为自然数,且n<m)。如下面的两个例子:

[peter@ibi98 sed]$ sed -n '2p' demo_sed
2 plant
[peter@ibi98 sed]$ sed -n '3,5p' demo_sed
3 fungi
4 protist
5 eubacteria

$表示文本的最后一行,如5,$表示第5行至最后一行。

2. 相对地址

相对地址的语法为:n,+m(n,m为自然数),其范围为第n行至第n+m行。如下面的例子:

[peter@ibi98 sed]$ sed -n '2,+3p' demo_sed
2 plant
3 fungi
4 protist
5 eubacteria

3. 匹配地址

匹配地址的语法为:pattern1[,pattern2](pattern为模式),如果只有一个模式,则为匹配到该模式的所有的行;如果有两个模式,其范围为第一次匹配到pattern1的行至最后一次匹配到pattern1之后第一次匹配到pattern2的行(如果最后一次匹配到pattern1之后匹配不到pattern2,则为第一次匹配到pattern1的行至文件尾)。如下面的两个例子:

[peter@ibi98 sed]$ sed -n '/fu/p' demo_sed
3 fungi
[peter@ibi98 sed]$ sed -n '/fu/,/eu/p' demo_sed
3 fungi
4 protist
5 eubacteria

4. 组合地址

上述的绝对地址或相对地址可以与匹配地址组合起来,如绝对地址+匹配地址:

[peter@ibi98 sed]$ sed -n '1,/pr/p' demo_sed
1 animal
2 plant
3 fungi
4 protist

相对地址+匹配地址:

[peter@ibi98 sed]$ sed -n '/fu/,+1p' demo_sed
3 fungi
4 protist

5. 步进地址

步进地址的语法为:n~m(n:起始行,m:步长)。如奇数行:

[peter@ibi98 sed]$ sed -n '1~2p' demo_sed
1 animal
3 fungi
5 eubacteria

偶数行:

[peter@ibi98 sed]$ sed -n '2~2p' demo_sed
2 plant
4 protist
6 archaea

第2、5、8...行:

[peter@ibi98 sed]$ sed -n '2~3p' demo_sed
2 plant
5 eubacteria

二、操作符

sed命令常用的操作符有:

p		打印定位行
=		显示定位行的行号
d		删除定位行
s/old/new/[g]	替换
a\text		在定位行后添加内容text
i\text		在定位行前插入内容text
c\text		将定位行内容替换为text

1. p操作

p操作上面已经给了多个例子,这里不再赘述。

2. =操作

=操作用于显示定位行的行号,一般用来显示匹配地址的行号:

[peter@ibi98 sed]$ sed -n '/fun/=' demo_sed
3

3. d操作

d操作符可以删除定位到的行,如:

[peter@ibi98 sed]$ sed '1d' demo_sed
2 plant
3 fungi
4 protist
5 eubacteria
6 archaea
[peter@ibi98 sed]$ sed '2,4d' demo_sed
1 animal
5 eubacteria
6 archaea
[peter@ibi98 sed]$ sed '4,+1d' demo_sed
1 animal
2 plant
3 fungi
6 archaea
[peter@ibi98 sed]$ sed '/ a/d' demo_sed
2 plant
3 fungi
4 protist
5 eubacteria

4. s操作符可以将定位到的行中的某些内容替换成别的内容,如:

[peter@ibi98 sed]$ sed '2,4s/p/P/' demo_sed
1 animal
2 Plant
3 fungi
4 Protist
5 eubacteria
6 archaea
[peter@ibi98 sed]$ sed 's/a/A/' demo_sed
1 Animal
2 plAnt
3 fungi
4 protist
5 eubActeria
6 Archaea
[peter@ibi98 sed]$ sed 's/a/A/g' demo_sed
1 AnimAl
2 plAnt
3 fungi
4 protist
5 eubActeriA
6 ArchAeA

修饰符g表示替换行中所有匹配到的模式,如果没有g修饰符,则只替换每行第一个匹配到的模式。

5. a操作符可以在定位到的行后面添加内容,如:

[peter@ibi98 sed]$ sed '2a\apple' demo_sed
1 animal
2 plant
apple
3 fungi
4 protist
5 eubacteria
6 archaea

6. i操作符可以在定位到的行前面插入内容,如:

[peter@ibi98 sed]$ sed '4i\yeast' demo_sed
1 animal
2 plant
3 fungi
yeast
4 protist
5 eubacteria
6 archaea

7. c操作符可以将定位到的行替换成指定内容,如:

[peter@ibi98 sed]$ sed '/eubacteria/c\bacteria' demo_sed
1 animal
2 plant
3 fungi
4 protist
bacteria
6 archaea

sed命令中的匹配和替换可以使用正则表达式,因此可以完成复杂的文本处理任务。sed也可以利用-n选项和p操作,方便地把文本中的指定内容取出来。

<<上一节  下一节>>