咦,我发现啊, sed 的所有命令都是 单字母 耶,比如 打印输出 p 命令是 print 的缩写。
在sed 简介 章节中我们有说过: sed 可以对文字的增删改替换查( 过滤、取行 ) 。
查( 过滤、取行 ) 功能我们前面利用了两个章节详细介绍了下。本章节我们来介绍下 删 命令。
sed 删除命令 d
sed支持删除文本行,删除命令为 d ,是 delete 的缩写。
顾名思义,delete 命令用于执行删除操作。
由于sed 是对 行 进行操作,我们可以说这个命令用于 删除行
sed 删除命令 d 的语法
删除命令配合前面我们学习的 行寻址 和 模式寻址 语法,格式一般为
[address1[,address2]]d
- address1 和 address2 分别是 起始地址 和 结束地址,可以是 行号或 模式字符串。
- address1 和 address2 都是可选参数,可以都不填,这时候就是删除所有行,从文件的开头到文件结束。
- 如果存在一个,那么就是删除 单行。也就是只删除 address1 指定的那行。
- d 命令仅从 模式缓冲区 中删除行,也就是该行不会发送到输出流,原始文件保持不变。
是不是很眼熟,其实就是把前面学习的 [n,m] p 命令中的 p 换成了 d 而已。
注意
delete 命令仅从 模式缓冲区 中删除行,也就是该行不会发送到输出流,原始文件保持不变。
范例: 删除所有行
我们仅使用 d 命令不输出模式缓冲区中的所有行。
[www.ddkk.com]$ sed 'd' data.txt
上面的sed 脚本输出结果如下
打开源文件 data.txt,可以发现数据还在
1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
3) 小李,25岁,斯坦福大学
4) 小王,22岁,清华大学
想必你应该不会对上面的结果感到疑惑吧!
为什么什么都没输出?
因为我们没有提供 地址范围。
没有提供 地址范围 的情况下,sed 操作会处理每一行,也就是使用 d 命令删除每一行。都删除了,自然就没有任何结果了。
范例2 :删除指定单行
上一个范例我们使用 d 命令删除了所有的行。其实我们可以指定只删除某一行。
比如下面的命令我们指定只删除第 3 行。
[www.ddkk.com]$ sed '3d' data.txt
运行结果如下
1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
4) 小王,22岁,清华大学
范例3:删除指定范围的行
我们还可以同时指定 address1 和 address2 来删除指定范围区间的行。
例如下面的代码,我们使用 2,3 来删除从第 2 行开始到第 3 行之间的所有行,也就是删除 2、3 行。
[www.ddkk.com]$ sed '2, 3 d' data.txt
运行上面的范例,输出结果如下
1) 小明,23岁,北京大学
4) 小王,22岁,清华大学
范例4: 删除匹配模式的行
除了可以用 行号 来指定要删除的行或行区间外,我们还可以使用 模式 来删除行。
例如下面的命令删除所有包含 清华 的行
[www.ddkk.com]$ sed '/清华/d' data.txt
上面的sed 命令运行结果如下
1) 小明,23岁,北京大学
3) 小李,25岁,斯坦福大学
范例5: 删除匹配模式区间的行
模式匹配除了可以用来删除单行,我们还可以使用模式区间来删除行。
也就是把我们语法中的 address1 和 address2 都改为 模式 即可。
例如下面的命令用于删除从包含 明 的行开始到包含 李 的行之间的所有行。
[jerry]$ sed '/明/,/李/d' data.txt
上面的sed 命令运行结果如下
4) 小王,22岁,清华大学
其它范例
除了上面我们提到的那些之外,sed 还支持 $
、+ 、~ 等操作符。我们这里就不一一介绍了。