sed 输入源读行命令 N
我们前面说过,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.twle.cn]$ sed 'N; s/\n/ #~# /g' data.txt
运行结果如下
1) 小明,23岁,北京大学 #~# 2) 小红,22岁,清华大学 3) 小李,25岁,斯坦福大学 #~# 4) 小王,22岁,清华大学 5) 小刚,27岁,北京大学 #~# 6) 小英,21岁,哈佛大学
是不是很神奇?
需要我解释下运行流程嘛?
-
程序开始执行时默认从输入源中读取一行放到 模式缓冲区 中
因此模式缓冲区里的数据为
1) 小明,23岁,北京大学
-
当遇到
N
命令,会再从输入源中读取一样然后以新行的方式追加到模式缓冲区里此时模式缓冲区里的数据为
1) 小明,23岁,北京大学 2) 小红,22岁,清华大学
-
第二条命令替换,把换行符替换为
#~#
。替换之后模式缓冲区里的数据为1) 小明,23岁,北京大学 #~# 2) 小红,22岁,清华大学
接下来的事情你就知道了,哈哈