10、sed 删除命令 d

咦,我发现啊, 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 还支持 $ 、+ 、~ 等操作符。我们这里就不一一介绍了。