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