sed 工具的高级用法
模式空间与保持空间
sed 在正常情况下,将文本一行一行读入到模式空间(pattern space),对匹配的行执行处理后再输出,直到文件末尾。
在某些时候可以使用保持空间(hold space),可以完成一些复杂操作。
将模式空间理解为流水线,每经过一条数据都会进行处理。而保持空间可以看做一个仓库,可以从里面取数据到模式空间,也可以将模式空间已有数据放到保持空间。
sed 高级命令
- g:将保持空间中的内容拷贝到模式空间,并清空模式空间的内容
- G:将保持空间中的内容追加到模式空间的下一行
- h:将模式空间中的内容拷贝到保持空间,并清空保持空间的内容
- H:将模式空间中的内容追加到保持空间的下一行
- d:删除模式空间中的所有行,并读入下一行到模式空间中
- D:删除模式空间中的第一行,不读入下一行
- n:读取下一行到模式空间
- N:将下一行追加到模式空间
- x:交换保持空间和模式空间的内容
命令记忆技巧
从保持空间拿数据到模式空间 可以看做 get ,即g 或者 G
从模式空间放数据到保持空间 可以看做 hold , 即h 或者 H
小写都是覆盖,大写是追加。
在每行末尾添加一行空行
模拟实现 tac 命令的功能
1!G : 1 表示定址第一行,!G 不执行G (不从保持空间拿数据到模式空间)命令,整个意思就是 第一行不执行 “G”命令,从第二行开始执行。
$!d:$ 表示最后一行,!d 表示在最后一行时,不清空模式空间。其余行都要执行
追加匹配行到文件结尾
匹配 World 和 Jack 并追加到文件末尾
-e :表示可以并列多个 处理语句
$G:表示最后一行时,从保持空间拿出数据
行列转换
将所有行读取,Hold 到保持空间,最后一行时,交换保持空间与模式空间的内容,并替换回车。
计算1-100的和
seq n 生成 1-n 的序列。 使用sed 将所有行Hold 到保持空间,当最后一行时替换回车为+号,替换后发现,在一开头还有一个+号,所以在进行一个以+ 开头的替换,最后重定向到 bc 计算结果。
计算1-100的和-使用标签
:a 表示设定一个其实标签,N 表示读取下一行,然后将换行替换为+号, ba 表示跳转到标签a 处继续执行。
打印奇数行和偶数行
n 表示不打印当前行,并读取下一行。