sed 工具的高级用法

模式空间与保持空间

sed 在正常情况下,将文本一行一行读入到模式空间(pattern space),对匹配的行执行处理后再输出,直到文件末尾。

在某些时候可以使用保持空间(hold space),可以完成一些复杂操作。

将模式空间理解为流水线,每经过一条数据都会进行处理。而保持空间可以看做一个仓库,可以从里面取数据到模式空间,也可以将模式空间已有数据放到保持空间。


sed 高级命令

  • g:将保持空间中的内容拷贝到模式空间,并清空模式空间的内容
  • G:将保持空间中的内容追加到模式空间的下一行
  • h:将模式空间中的内容拷贝到保持空间,并清空保持空间的内容
  • H:将模式空间中的内容追加到保持空间的下一行
  • d:删除模式空间中的所有行,并读入下一行到模式空间中
  • D:删除模式空间中的第一行,不读入下一行
  • n:读取下一行到模式空间
  • N:将下一行追加到模式空间
  • x:交换保持空间和模式空间的内容

命令记忆技巧
从保持空间拿数据到模式空间 可以看做 get ,即g 或者 G
从模式空间放数据到保持空间 可以看做 hold , 即h 或者 H
小写都是覆盖,大写是追加。


在每行末尾添加一行空行


sed 工具的高级用法


模拟实现 tac 命令的功能

sed 工具的高级用法

1!G : 1 表示定址第一行,!G 不执行G (不从保持空间拿数据到模式空间)命令,整个意思就是 第一行不执行 “G”命令,从第二行开始执行。

$!d:$ 表示最后一行,!d 表示在最后一行时,不清空模式空间。其余行都要执行


追加匹配行到文件结尾

sed 工具的高级用法

匹配 World 和 Jack 并追加到文件末尾
-e :表示可以并列多个 处理语句
$G:表示最后一行时,从保持空间拿出数据


行列转换

sed 工具的高级用法

将所有行读取,Hold 到保持空间,最后一行时,交换保持空间与模式空间的内容,并替换回车。


计算1-100的和

sed 工具的高级用法

seq n 生成 1-n 的序列。 使用sed 将所有行Hold 到保持空间,当最后一行时替换回车为+号,替换后发现,在一开头还有一个+号,所以在进行一个以+ 开头的替换,最后重定向到 bc 计算结果。

计算1-100的和-使用标签

sed 工具的高级用法

:a 表示设定一个其实标签,N 表示读取下一行,然后将换行替换为+号, ba 表示跳转到标签a 处继续执行。


打印奇数行和偶数行

sed 工具的高级用法

n 表示不打印当前行,并读取下一行。