什么是sed
sed是stream editor的缩写,是一个非交互式的文本编辑器
sed是基于行的
sed逐行读入,逐行操作
sed只是将其处理结果送至stdout,因此不会修改任何输入文件
sed的一般格式
sed [option] '[sed command]' [file]
1.option即sed的参数,常用的有:
- -n :使用安静模式,只将经过sed特殊处理的行(而非全部行)送至stdout
- -e :直接在命令行模式上进行sed的操作编辑
- -f :将sed的操作写在一个文件内,-f filename可以执行filename里的sed操作
关于-n和-e的具体涵义,还需要进一步研究
2.sed command是sed的主体部分
首先要确保sed command被单引号包括,以避免与shell自带的meta相冲突
sed command的一般结构为:
[地址][操作]
- 地址:指定sed需要操作哪些行,有四种类型
- n :指定行号
- n,m :指定行号范围
- /.../ :正则表达式匹配(匹配的不是行号,而是行的内容)
- /.../,/.../ :正则表达式匹配范围(事实上在指定范围时,指定行号和正则表达式匹配可以混用,如n,/.../)
- 操作:以“地址”指定的行为目标所进行的处理,主要有
- d :删除整行
- p :输出至stdout
- s/str1/str2/或s/str1/str2/g :将str1替换为str2,不加g表示只替换每行的第一个匹配,加g表示全部替换
- i str :将str插入至指定行的上一行
- a str :将str插入至指定行的下一行
- c str :将指定行替换为str
需要牢记的几点:
1)地址不是强制要求的,缺省情况下sed将对每一行都进行操作
2)sed命令中可以有多个sed command,用分号进行分隔,形如:
sed [option] '[sed command 1]; [sed command 2]' [file]
3)地址和操作之间没有空格
4)sed command中,可对同一地址进行多个操作,用{}包括并用空格分隔,形如:
[地址]{[操作1] [操作2]}
3.综上所述,sed命令的完整形式为
sed [option] '[地址1]{操作1 ... 操作n}; ...; [地址m]{操作1 ... 操作n}' [file]
1.$在地址中出现时,表示文件的最后一行
2.可以用!对地址取反,如
sed -e '$!d' data #表示删除除最后一行外的所有行
3.sed可用/(和/)对s/.../.../内进行编号-指定-替换