曲径通幽论坛

标题: 将段标签添加到该段中的每行前面 [打印本页]

作者: beyes    时间: 2012-2-4 13:14
标题: 将段标签添加到该段中的每行前面
下面例子演示了将一个段的段标签添加到该段中的每一行之前。测试文本如下:
[beyes@beyes   sed]$ cat tmp.txt
#website
        groad.net
        baidu.com
        sina.com

#system
        linux
        unix
        windows

#Windows
        win7
        winXP
        winMe
该文本中,#website ,#system 以及 #Windows 都是段标签。下面将这些标签添加到各自段落中的每一行之前,运行命令如下:
[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 个空格符的距离。




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