曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4545|回复: 0
打印 上一主题 下一主题

将段标签添加到该段中的每行前面

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2012-2-4 13:14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面例子演示了将一个段的段标签添加到该段中的每一行之前。测试文本如下:
[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 个空格符的距离。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-11-1 08:03 , Processed in 0.072837 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表