[beyes@beyes sed]$ sed -e '/./{H;$!d;}' -e 'x;/groad/!d' tmp.txt
#beyes
groad.net
baidu.com
sina.com
#Windows
win7
groad.net
winXP
在 '/./{H;$!d;}' 这条命令组里,首先会检测该行是否为空行,如果不是,那么 H 命令将已读入到 pattern space 的内容追加到 hold space 中,接着查看该行是不是最后一行,如果不是,那么就将该行从 pattern space 中删除掉,然后重新启动命令循环(d 命令)。注意,因为刚开始时,hold space 里是没有内容的,也就相当于有一个空行在其中,那么第一行 #beyes 追加进去后就内容就变成了:(空行)\n#beyes 。这也就是输出中会看到第一行是条空白行的原因。
如果在执行命令时遇到一个空行,那么就会执行 'x;/groad/!d' 这个命令组,此时的情况也就是碰到了一个段落。x 命令时交换 hold space 和 pattern space 内容的,所以之前在 hold space 中读入的段落将被替换到 pattern space 中,然后会检查一下该段落中是否含有 groad 字样,若是没有则删除掉整个段落,有则会被输出来。