21、sed 输出多行命令 P

在前面的章节 sed 输入源读行命令 N 中我们学习了如何从输入源中读取多行然后追加到 模式缓冲区 中。

但随之也带来了一个问题,我们知道,p 命令用于输出 模式缓冲区 中的数据,而且是一股脑儿全部输出的。

[www.ddkk.com]$ sed -n 'N;N;p;N;N;N' data.txt

假设data.txt 中的内容如下

1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
3) 小李,25岁,斯坦福大学
4) 小王,22岁,清华大学
5) 小刚,27岁,北京大学
6) 小英,21岁,哈佛大学

那么输出结果如下

1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
3) 小李,25岁,斯坦福大学

为了方便演示 p 命令的效果,我们使用 N 命令从输入源中读取前两行加上默认读取的行,在 p 命令之前已经有 3 行了。

从输出结果中可以看到 p 命令把 3 行都输出了。

后面的三个 N 命令是为了演示目的,主动不输出。

问题来了,我们可以不可以中输出 模式缓冲区 中的部分行呢?

答案是肯定的。

sed提供了大写字母 P 命令用于输出 模式缓冲区 中的指定行。

sed 输出多行命令 P

与p 命令一股脑儿的输出模式缓冲区中的全部数据不同,大写字母 P 用于输出模式缓冲区中的指定行。

如果模式缓冲区只有一行,那么, p 和 P 命令的作用是相同的。

大写字母 P 命令的语法格式如下

[address1[,address2]]P

address1 和 address2 是 行寻址 的开始行和结束行

范例

我们改良下上面的范例,使用 N 命令从输入源中读取一行,但使用 P 命令只输出第一行,达到只输出奇数行的效果。

[www.ddkk.com]$ sed -n 'N;P' data.txt

运行结果如下

1) 小明,23岁,北京大学
3) 小李,25岁,斯坦福大学
5) 小刚,27岁,北京大学