查找两个字符串之间的内容并删除换行符

好久没来了,之前学的shell技巧也忘记的十之有八了。
请教一个问题

有一个文本a.txt
内容如下

3.230: [full gc (system)3.230: [cms : ok->3729k(1310720k),0.0657070 secs】75511k->3729k(1939904k),[cms perm : 13040k->13029k(307200k)],0.0657790 secs] [times: user=0.07 sys=0.01,real=0.07 secs]
12.745:[gc 8.675: [parnew: 471936->21331k(629184k),0.035690 secs]  [times: user=0.07 sys=0.01,real=0.07 secs]
12.745:[gc 8.675: [parnew: 471936->21331k(629184k),0.035690 secs]  [times: user=0.07 sys=0.01,real=0.07 secs]
12.745:[gc 8.675: [parnew: 471936->21331k(629184k),0.035690 secs]  [times: user=0.07 sys=0.01,real=0.07 secs]
........
3.230: [full gc (system)3.230: [cms : ok->3729k(1310720k),0.0657070 secs】75511k->3729k(1939904k),[cms perm : 13040k->13029k(307200k)],0.0657790 secs] [times: user=0.07 sys=0.01,real=0.07 secs]

12.745:[gc 8.675: [parnew: 471936->21331k(629184k),0.035690 secs]  [times: user=0.07 sys=0.01,real=0.07 secs]
12.745:[gc 8.675: [parnew: 471936->21331k(629184k),0.035690 secs]  [times: user=0.07 sys=0.01,real=0.07 secs]
...........
3.230: [full gc (system)3.230: [cms : ok->3729k(1310720k),0.0657070 secs】75511k->3729k(1939904k),[cms perm : 13040k->13029k(307200k)],0.0657790 secs] [times: user=0.07 sys=0.01,real=0.07 secs]
3.230: [full gc (system)3.230: [cms : ok->3729k(1310720k),0.0657070 secs】75511k->3729k(1939904k),[cms perm : 13040k->13029k(307200k)],0.0657790 secs] [times: user=0.07 sys=0.01,real=0.07 secs]



如何能将上面文本按[full gc为关键字搜索 找到这行以后. 把两个[full gc之间的内容的换行符删除.

也就是以[full gc为关键合并行.一行保证只有一个[full gc

多谢了

作者: rishairu   发布时间: 2011-06-15

在线等 自己顶一下

作者: rishairu   发布时间: 2011-06-15

  1. awk '/\[full gc/{print ""}{printf $0}' urfile
复制代码

作者: ly5066113   发布时间: 2011-06-15

非常感谢 我去试一下

作者: rishairu   发布时间: 2011-06-15

本帖最后由 liion631818 于 2011-06-15 10:45 编辑
  1. sed -e '/\[full gc/{
  2. :a
  3. $!N
  4. /.*\n.*\[full gc.*/!{
  5. s/\n//g
  6. ta
  7. }
  8. P
  9. D
  10. }' file
复制代码

作者: liion631818   发布时间: 2011-06-15



QUOTE:
ly5066113 发表于 2011-06-15 10:29




   原来是这样,怎么我就只想到一个sed呢,复杂了。。

作者: liion631818   发布时间: 2011-06-15

回复 liion631818


N 前面不加 $! 会有问题的。

作者: ly5066113   发布时间: 2011-06-15

liion631818兄的代码有点深奥
能给兄弟讲解一下么

作者: rishairu   发布时间: 2011-06-15

回复 ly5066113


    是哦,full gc出现在最后一行就出问题了。我改下

作者: liion631818   发布时间: 2011-06-15

回复 rishairu


    大概讲下吧,最好你去看看sed & awk这本书
  1. sed -e '/\[full gc/{
  2. :a
  3. $!N #当匹配到full gc的时候就读取下一行放进pattern space,2行之间会以\n分割
  4. /.*\n.*\[full gc.*/!{
  5. s/\n//g # 把2个full gc之间的\n都替换为空,\n是有N读取下一行的时候sed自动加入的,作为2行的分隔符
  6. ta #循环,直到出现第二个full gc
  7. }
  8. P # 打印pattern space中的第一行
  9. D #删除pattern space的第一行
  10. }' file
复制代码

作者: liion631818   发布时间: 2011-06-15