曲径通幽论坛

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

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

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34399
跳转到指定楼层
楼主
发表于 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, 2026-10-11 15:32 , Processed in 0.110949 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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