LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 797|回复: 7

这个问题用sed怎么解决

[复制链接]
发表于 2004-5-21 02:39:08 | 显示全部楼层 |阅读模式

  1. asiejfase
  2. jlsieje
  3. ejfoiaoejq
  4. sajifeowef
  5. scnjovjoi

  6. kjvoiejwoqie
  7. joeicjlsd
  8. aslc

  9. lkasjcov
  10. lskdowie
  11. laksdjoew
复制代码

这是一个较归整的数据文件(抱歉,数据不便贴出), 结构如上. 每段数据完结后都有一个空行来分割, 现在的要求是有一段文字要加到每一个数据block的结尾, 从而形成这样的新文件:

  1. 所加内容为:
  2. aaa
  3. bbb
  4. ccc
  5. 则文件变为:
  6. asiejfase
  7. jlsieje
  8. ejfoiaoejq
  9. sajifeowef
  10. scnjovjoi
  11. aaa
  12. bbb
  13. ccc

  14. kjvoiejwoqie
  15. joeicjlsd
  16. aslc
  17. aaa
  18. bbb
  19. ccc

  20. lkasjcov
  21. lskdowie
  22. laksdjoew
  23. aaa
  24. bbb
  25. ccc
复制代码

怎样用sed来完成? 主要的问题是匹配空行...
发表于 2004-5-21 02:47:42 | 显示全部楼层

  1. /^$/c\
  2. aaa\
  3. bbb\
  4. ccc\
  5. \
复制代码
 楼主| 发表于 2004-5-21 02:53:30 | 显示全部楼层
谢谢教主, 我也找到了, 是用^$, 我原来用\n来匹配, 不对.
发表于 2004-5-21 02:56:32 | 显示全部楼层
呵呵。
ps:最近很忙,以前说过要把正则表达式详细谈谈的,还没有做,各位兄弟原谅,以后一定补上。
 楼主| 发表于 2004-5-21 04:20:47 | 显示全部楼层
又有两个问题:
1. 如何表示"将多于一个的空行变成只有一个空行", 我用"/^$\+/^$/",或"/^$\{1,\}/^$\{1\}/"都不起作用.
2. 下面这种情况怎用sed写:

  1. 123|ksejo|iejow|lkjo
  2. 123|lsiejoe|aslijoc|asijefo||
  3. 123|jciso|sjo|4|asljc||
  4. aaa
  5. bbb
  6. ccc

  7. 234|klwie|skv|dfwiuej|1|slkjfo|
  8. 234|skldjcoe|sckiwj|asckhre|fnc||
  9. 234|sacjok|csnkg|sdiw|scjiow|asef|
  10. aaa
  11. bbb
  12. ccc
复制代码

这是上段文件中经过append后的情况, 现在需要在每段的append的部分的头都加上这个数据段的标识, 也就是"|"的第一域:123, 234...之后数据段都变成这样:

  1. 123|ksejo|iejow|lkjo
  2. 123|lsiejoe|aslijoc|asijefo||
  3. 123|jciso|sjo|4|asljc||
  4. 123|aaa
  5. 123|bbb
  6. 123|ccc

  7. 234|klwie|skv|dfwiuej|1|slkjfo|
  8. 234|skldjcoe|sckiwj|asckhre|fnc||
  9. 234|sacjok|csnkg|sdiw|scjiow|asef|
  10. 234|aaa
  11. 234|bbb
  12. 234|ccc
复制代码

每段数据的标识都不一样,这个用sed我做不出来.
发表于 2004-5-21 08:10:54 | 显示全部楼层

我写了一个,试试看.^_^

For the 1st question:

#"将多于一个的空行变成只有一个空行"
sed '/./,/^$/!d' your_data_file

As to the 2nd one:

foo.sed
____________________________________________
#!/bin/sed

/^$/b
/^[0-9]\{3\}|/ {
                h
                b
              }
G
s/^\(.*\)\n\([0-9]\{3\}|\).*$/\2\1/
____________________________________________

[command line]$ sed -f foo.sed your_data_file

第2个问题,我看你给出的sample文件和你的要求,我假设:

1)不同数据段之间是以空行分割的
2)对每个数据段,标识是相同的(如123,或234),且是3位整数

如果标识是其他形式的话,稍加改动就可以了,不复杂.
 楼主| 发表于 2004-5-21 10:35:01 | 显示全部楼层
是的,数据段是以空行来分割的. 每个数据段的标识是相同的,但位数却不是一定都是三位. 是我的sample数据还是没有举好. 不过确实是很好更改了. 非常感谢! sed的好几个命令我还不熟,正好可以多学习一下你的code.
发表于 2004-5-21 10:48:09 | 显示全部楼层

我又看了一下,发现楼主就是想在append数据的时候直接把标识加上去是吧?所以我另写了一

foo.sed
______________________________________________________________
#!/bin/sed -n

/^$/!{
  N
  /.*\n$/{
    P
    s/^\([0-9]\{3\}|\).*$/\1my\n\1text\n\1appended\n/p
    b
  }
P
D
}
______________________________________________________________

[command line]$ sed -n -f foo.sed your_data_file

你要加什么数据,就更改my text appended就可以了.这样,数据和标识会一块加上.

由于"N"的关系,__切记__,your_data_file最末尾要留两个空行!否则,最后一段数据段
不会添加追加的数据.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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