在前面的章节 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岁,北京大学