一、处理多行命令
sed编辑器有3种可用于处理多行文本的特殊命令。
- N:加入数据流中的下一行,创建一个多行组进行处理;
- D:删除多行组中的一行;
- P:打印多行组中的一行。
1、next命令:N
单行next命令
单行next(n)命令会告诉sed编辑器移动到数据流中的下一行,不用再返回到命令列表的最开始位置。通常sed编辑器在移动到数据流中的下一行之前,会在当前行中执行完所有定义好的命令,而单行next命令却不一样。
如下所示,文本test.txt中有两行空行。
我们想只删除第一行空行,执行下面的命令却无法做到,它会将两行空行都删除掉。
bash
sed '/^$/d' test.txt
可以用单行next命令解决此问题:
bash
sed '/成都/{n ; d}' test.txt # d表示删除
先用脚本查找到含有"成都 "的那一行,然后,单行next命令(n) 会让sed编辑器移动到文本的下一行,也就是我们想要删除的空行,接着,sed编辑器继续执行命令列表中的命令,即使用删除命令(d) 删除空行。sed编辑器在执行完命令脚本后会读取数据流中的下一行文本,并从头开始执行脚本,但它却找不到包含"成都"的行了,所以就不会再删除其它行。
合并文本行
单行next(n)命令会将数据流中的下一行移入sed编辑器的工作空间(模式空间)。多行版本的next(N)命令则是将下一行添加到模式空间中已有文本之后。这样就会将数据流中的两行文本合并到同一个模式空间中,文本行之间仍然用换行符分隔,但sed编辑器会将两行文本当成一行来处理。
bash
sed '/重庆/{N ; s/\n/ / }' test.txt
sed编辑器首先找到含有"重庆"的行,找到后,使用N命令将下一行与该行合并,接着使用替换命令s将换行符(\n)替换成空格。如此一来,两行文本就会成为一行后输出。
在数据文件中找到一个可能会分散在两行中的文本短语。
如下所示,电信和诈骗园区之间的 . 是用来匹配空格和换行符的,但如果它匹配到了换行符,就会删掉换行符,从而导致两行合并成一行。
可以使用两个替换命令解决上面两行合并成一行的问题。
第一个替换命令用来处理短语出现在单行中的情况,第二个替换命令用来处理短语出现在多行中的情况。
2、多行删除命令:D
sed编辑器中的多行删除命令(D)只会删除模式空间中的第一行,即删除该行中的换行符及其之间的所有字符。
删除目标数据字符串所在行的前一行。
bash
sed '/^$/{N ; /缅北/D}' test.txt
sed编辑器首先会查找空行,然后用N命令将下一行加入模式空间,如果模式空间中有含有"缅北"的词语,那么D命令就会删除模式空间中的第一行。
3、多行打印命令:P
多行打印命令(P)只打印模式空间中的第一行,即打印模式空间中的换行符及其之前所有字符。当用-n选项来抑制脚本输出时,它就和显示文本的单行p命令的用法差不多。