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操作,方便地把文本中的指定内容取出来。