我们前面说过,sed 是行文字处理器。
之所以这么说,是因为默认情况下,sed 只会从输入源中读取一行然后处理一行。
其实,sed 是可以处理多行的。 sed 提供了单字母命令 N 从输入源中读取多行然后追加到 模式缓冲区中。
注意: 读取多行的命令是大写字母 N。
读取多行命令 N 与读取单行命令 n 是不同的,不同之处在于
N命令不会输出和清空缓冲区,仅仅是从输入源中读取行然后以新行的方式追加到模式缓冲区。
也就是说,N 命令会现在模式缓冲区后面追加 换行符 \n 然后把读取的内容追加在换行符后面。
N命令的语法格式如下
[address1[,address2]]N
address1 和 address2 是 行寻址 的开始行和结束行
范例
开始范例前,我们先准备下数据文件,假设当前目录下存在文件 data.txt 内容如下
1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
3) 小李,25岁,斯坦福大学
4) 小王,22岁,清华大学
5) 小刚,27岁,北京大学
6) 小英,21岁,哈佛大学
下面的命令把相邻的两行放在同一行并使用 #~# 分隔
[www.ddkk.com]$ sed 'N; s/\n/ #~# /g' data.txt
运行结果如下
1) 小明,23岁,北京大学 #~# 2) 小红,22岁,清华大学
3) 小李,25岁,斯坦福大学 #~# 4) 小王,22岁,清华大学
5) 小刚,27岁,北京大学 #~# 6) 小英,21岁,哈佛大学
是不是很神奇?
需要我解释下运行流程嘛?
1、 程序开始执行时默认从输入源中读取一行放到模式缓冲区中;
因此模式缓冲区里的数据为
1) 小明,23岁,北京大学
2、 当遇到N命令,会再从输入源中读取一样然后以新行的方式追加到模式缓冲区里;
此时模式缓冲区里的数据为
1) 小明,23岁,北京大学
2) 小红,22岁,清华大学
- 第二条命令替换,把换行符替换为 #~#。替换之后模式缓冲区里的数据为
1) 小明,23岁,北京大学 #~# 2) 小红,22岁,清华大学
接下来的事情你就知道了,哈哈