Content #
D命令的独特之处在于其删除模式空间中的第一行之后,会强制sed编辑器返回到脚本的起始处,对当前模式空间中的内容重新执行此命令(D命令不会从数据流中读取新行)。在脚本中加入N命令,就能单步扫过(single-step through)整个模式空间,对多行进行匹配。
接下来,先使用P命令打印出第一行,然后用D命令删除第一行并绕回到脚本的起始处,接着N命令会读取下一行文本并重新开始此过程。这个循环会一直持续到数据流结束。
$ cat corruptData.txt
Header Line#
@
Data Line #1
Data Line #2#
@
End of Data Lines#
@
$
$ sed -n '
> N
> s/#\n@//
> P
> D
> ' corruptData.txt
Header Line
Data Line #1
Data Line #2
End of Data Lines
$
数据文件被破坏了,在一些行的末尾有#,接着在下一行有@。为了解决这个问题,可以使用sed将Header Line#行载入模式空间,然后用N命令载入第二行(@),将其附加到模式空间内的第一行之后。替换命令用空值替换来删除违规数据(#\n@),然后P命令只打印模式空间中已经清理过的第一行。D命令将第一行从模式空间中删除,并返回到脚本的开头,下一个N命令将第三行(Data Line #1)文本读入模式空间,继续进行编辑循环。