sed是一个流编辑器(stream editor),一个非交互式的行编辑器。在命令行中输入编辑命令、指定要处理的输入文件,然后在屏幕上查看输出。

输入文件可以是指定的文件名,也可以是来自一个管道的输出。

sed编辑器在运行的时候不必人工干涉,常被称作批编辑器,此特性允许在脚本中使用编辑命令。

 

sed以按顺序逐行的方式工作:

1.从输入读取一行数据存入临时缓冲区(称为模式空间,pattern space)

2.按指定的sed编辑命令处理缓冲区中的内容

3.把模式空间的内容送往标准输出,并将这行内容从模式空间中删除

4.读取下面一行,重复上面的过程

 

sed命令格式

格式1: sed [OPTION] [-e] command1 [[-e command2] ... [-e commandn]] [input-file] ...

可以指定多个编辑命令,sed对这些命令依次进行处理。若仅有一个命令,可省略-e。GNU sed可以使用“;”分割命令。

格式2: sed [OPTION] -f script-file [input-file] ...

执行脚本文件中的sed编辑命令。

参数

-n: sed在将下一行读入pattern space之前,自动输出pattern space中的内容。此选项关闭自动输出,是否输出由编辑命令控制。

-r: 使用扩展正则表达式进行模式匹配。

 

sed的编辑命令包括地址和操作两部分。地址指定sed要操作的行,操作指定要进行的处理。

提示:

1.通常使用单引号将整个操作命令括起来;

2.若操作命令中包含Shell变量替换,应该使用双引号将整个操作命令括起来。

注:地址和操作要连接在一起,之间不能有空格。

 

sed命令的地址表示方法 

分类    表示法            说明

0                    省略地质部分,输入的每一行进行处理

1      n             第n行 

1      f~s            从f开始的,步长为s的所有行

1      /regexp/         与正则表达式匹配的行

2      m,n            从第m行至第n行

2      m,+n           第m行以及其后的n行

2      /regexp1/,/regexp2/   匹配regexp1的行至匹配regexp2的行

2      /regexp/,n        匹配regexp的行至第n行

2      n,/regexp/        第n行至regexp匹配的行

 

sed支持的常用操作(sed支持25个操作)

操作                    说明

p                  打印

l                   显示所有字符

d                  删除

=                  显示匹配行的行号

s/regexp/replacement/       将指定行第一个匹配regexp替换为replacement

s/regexp/replacement/g       将指定行的所有匹配regexp替换为replacement

s/regexp/replacement/p       打印修改后的行

s/regexp/replacement/gp      打印修改后的行

s/regexp/replacement/w fname   将替换后的行写到文件fname中

s/regexp/replacement/gw fname   将替换后的行写到文件fname中

r fname               将另一个文件fname中的内容附加到指定行

w fname               将当前模式空间的内容写到文件fname中

n                  将指定行的下面一行读入模式空间

q                  读取到指定行之后推出sed

a\                  指定行下一行追加文本(主要用于sed脚本)

i\                  指定行上一行追加文本(主要用于sed脚本)

c\                  用新文本替换指定的行(主要用于sed脚本)

地址部分后面使用!表示反向选择

 

sed示例

#将出现的每个Unix替换为Unix/Linux(&表示匹配到的字符串)

$ sed -e 's/Unix/&\/Linux/g' file

#将所有连续出现的c都压缩成单个c

$ sed 's/cc*/c/g' file

#删除行首的一个空格

$ sed 's/ //' file

#删除每行前导的连续"空白字符"

$ sed 's/^[ \t]*//' file

 

在“s/.../.../”前面加上地址表达式来提高速度

#标准替换命令

sed 's/foo/bar/g' file

#速度更快

sed '/foo/ s/foo/bar/g' file

#简写形式

sde '/foo/ s//bar/g' file

 

若只替换第一次匹配foo的行,可以使用q短路后续行的执行

sed '/foo/{s/foo/bar/;q}' file

 

 

 

 

posted on 2010-11-02 21:14  龍蝦  阅读(1260)  评论(0编辑  收藏  举报