SED(Stream EDitor)是一种流式编辑器,它可以根据输入的命令行的命令或者存储在命令文本文件中的命令处理数据。它每次从输入读取一行数据,将该数据与所提供的编辑器命令进行匹配,根据命令修改数据流中的数据。在流编辑器将全部命令和一行数据匹配完之后,它读取下一行数据,并重复上述过程。处理完数据流中的全部数据行之后,流编辑器停止。sed依赖模式空间运行,而模式空间是一个活动的缓冲区,它在sed编辑器处理命令时保留被检查的文本。但它不是存储文本的唯一可用空间。sed利用另一个称为保留空间的缓存区。在处理模式空间中的其他行时,可以使用保留空间暂时保留文本行。
一、sed的基本知识
1、sed的格式
sed [options] 'script' input_file ...
sed [options] -f script_file input_file ...
option参数允许自定义sed命令的行为
script参数指定要应用于数据流的单个命令
script_file 命令文本
2、option选项
-f: 将文本中指定的命令添加到处理输入时执行的命令中
-i: 直接操作原文件
-r: 使sed支持扩展正则表达式
-e: 连接多个脚本
3、script的应用
sed 'ADDR1,ADDR2commond' input_file 对input_file中指定范围文本执行command命令
sed '/PATTERN/command' input_file
sed '/PATTERN1/,/PATTERN2/command' input_file ...处理第一次被第一个模式匹配的行到第一次被第二个模式匹配的行
PATTERN参数指的是正则表达式模式。sed默认情况下支持基本的正则表达式
command:sed命令
4、sed常用命令
d: 删除指定行
p: 打印命令;模式空间中的文本在处理之前,每一次都会先显示
=: 打印行号
a \: 在模式匹配到的行后面添加新内容
i \: 在模式匹配到的行前面添加新内容
\n: 实现添加多行
r: 从文本中读取
w: 把匹配的内容保存至文件中
n: 逐行读取,以覆盖的方式
N: 逐行读取,以追加的方式
h: 将模式中的内容复制到保留空间,覆盖的方式
H: 将模式中的内容复制到保留空间,追加的方式
g: 将保留空间内容复制到模式空间,覆盖的方式
G: 将保留空间内容复制到模式空间,追加的方式
b: 跳转, 略过符合模式的行
t label:测试:前面的s命令执行成功就跳转到标记位值
x: 保留空间和模式空间对调
5、常与sed连用的替换命令s
替换命令在替换多个文本行中的文本时效果不错。默认情况下仅替换各行中首次出现的文本。s的基本格式为:s/PATTERN/string/flag
PATTERN:匹配模式
string:替换的字符串
flag:替换标记
常用的替换标记有:
g:表示用新文本替换现有文本的全部实例
i:忽略大小写
p:打印原始行的内容
二、sed实例
现有2个文本:data和test
cat data
First line.
Second line.
Third line.
Fourth line.
cat test
He likes his liker.
She loves her lover.
1、删除命令
删除data中的第一行。
sed '1d' data
删除data中的第3、4行。
sed '3,4d' data
2、打印命令
(1)打印行命令p多与n选项连用。在模式空间中的文本处理之前,每一次都会先显示
打印test文本中的第一行
sed '/^H/p' test
He likes his liker.
He likes his liker.
She loves her lover.
若只想显示匹配后的内容则只需与添加-n选项
sed -n '/^H/p' test
He likes his liker.
(2)打印行号
打印test文本中行号
sed '=' test
1
He likes his liker.
2
She loves her lover.
使行号与文本在同一行
3、插入和附加命令
在test文本的第一行之前插入一句话:Welcome!
sed '1i\Welcome!' test
在test文本的第一行之后附加一句话:Welcome!
sed '1a\Welcome!' test
4、文件应用
写文件:将data文件的前两行写到test文件中
sed '1,2w test' data
cat test
First line.
Second line.
读文件: 读取test文件添加到data的第二行后面
sed '2r test' data
以上所述只是sed的基本用法,我们可以根据基本的用法自己编写高难度的sed命令。