[beyes@beyes sed]$ sed '/^#/{
> h
> d
> }
> G
> s/^\(.*\)\n#\(.*\)/\2 \1/' tmp.txt
website groad.net
website baidu.com
website sina.com
website
system linux
system unix
system windows
system
Windows win7
Windows winXP
Windows winMe
说明:
如果匹配段标签,那么就将该标签从 pattern space 复制到 hold space 中,接着将 pattern space 中删除掉该标签行,然后重启处理循环。在处理段中的行时,用 G 命令依次将 hold space 中的标签添加到各行的后边,此时 pattern space 中的内容变为:"'内容行'\n'段落标签'" 。最后将标签前面的 '#' 符号以及中间的换行符去掉后和段落行前后置换位置,于是可以看到输出的结果。这里需要注意的是,为什么第 2 段(#system) 和行之间相隔甚窄,而第 1 和第 3 行则相隔甚宽呢?注意观察,标签 system 只占有 6 个字符,外加命令中的替换部分的正则中多加的一个空格,供 7 个字符,而段落行之前都以一个 TAB 宽度打头,这个制表符的宽度为 8 个字符,所以这个宽度足以容纳下 7 个字符,因此第 2 个段和行之间看起来很窄(中间有 2 个空格)。另外,website 和 Windows 的字符宽度为 7 个,外加一个正则里给出的空格已经 8 个,那么这 8 个字符刚好可以填满 TAB 制表符的宽度,这样就造成了标签与行之间紧连在一起,所以 sed 这时会自动在其间添加一个 TAB 宽度,因此标签和段行之间看起来就有 9 个空格符的距离。