曲径通幽论坛

标题: H 与 x 命令 [打印本页]

作者: beyes    时间: 2012-2-3 10:40
标题: H 与 x 命令
H 命令将 pattern space 的内容追加到 hold space ,它们由换行符(\n)隔开。

x 命令将 hold space 的内容和 pattern space 的内容互换。

下面的例子使用 H 命令和 x 命令打印一个含有某匹配的段落。供测试用文本内容如下:
[beyes@beyes   sed]$ cat tmp.txt
#beyes
        groad.net
        baidu.com
        sina.com

#linux
        linux
        kernel

#Windows
        win7
        groad.net
        winXP
下面,我们将打印出含有 groad 的段,运行命令如下:
[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 字样,若是没有则删除掉整个段落,有则会被输出来。

上面所述即是一个段落的处理过程,其余段落同理处理。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2