1,695 views
首页 > 脚本 > 用sed截取文本段

用sed截取文本段

今天一个一块实习的小伙问了我一个问题,怎么通过正则表达式把文本中的一段截取出来,
文本大概的格式是这样的:

begin
a
b
c
d

end

取出每一个begin和end之间的部分,每一对begin和end之间的内容是不一样的。一开始我想这个问题时的思路是用sed根据正则表达式的多行匹配,;^begin\n.*end$;直接把那部分截取出来,后来试了试sed好像没法匹配跨行的正则表达式,不知道是不是因为我用的不对,sed处理数据的时候默认是按照行来处理的,不知道能不能有什么选项可以匹配多行。
最后想了想,解决方法是
sed -n ‘/^begin/,/end$/p’ file |grep -v begin|grep -v end
-n选项是设置默认不打印出来,然后匹配以begin开头(^),以end结尾($)的部分,并且用p选项设置这一部分打印出来,加个管道用grep的v选项把begin和end过滤掉。或者用一条grep -Ev ‘(begin|end)’ 也可以同时去掉begin和end。
唉,竟然还想了半天,主要是没想到可以用’/^begin/,/end$/p’,只记得了sed可以截取行与行之间的内容,不过要指定行号,比如说10到15行的内容,sed -n ‘10,15p’ file,我一开始还想了个很复杂的解决办法,cat -n file|grep begin|awk ‘{print $1}’ 这样的方式先找到begin和end的行号,然后再用sed,看来还是玩的不够熟啊…
另外,如果begin和end直接的行数是固定的,可以用一个简单的方法,比如每一对中间都是10行内容,grep -A10 begin|grep -v begin
就可以了,-A是above的意思,-B是below。
更正于2011 03/09 15:43
-A是after,-B是before的意思,前面说错了…

anyShare分享到:
分类: 脚本 标签: , ,
  1. starluo
    2013年1月7日11:14 | #1

    可以尝试使用sed 中的H,缓存信息,begin开始缓存,end打印出来

    [回复]

  2. 2015年7月27日23:45 | #2

    我们承接这些

    [回复]

  3. 2016年10月17日09:45 | #3

    好文章,内容见缝插针.禁止此消息:nolinkok@163.com

    [回复]

  4. 2016年10月17日09:45 | #4

    好文章,内容妙不可言.禁止此消息:nolinkok@163.com

    [回复]

  5. 2016年10月17日09:46 | #5

    不错的文章,内容层次清晰.禁止此消息:nolinkok@163.com

    [回复]

  6. 2016年10月24日09:43 | #6

    不错的文章,内容龙飞凤舞.禁止此消息:nolinkok@163.com

    [回复]

  7. 2017年3月22日15:27 | #7

    不错的文章,内容学富五车.禁止此消息:nolinkok@163.com

    [回复]

  8. 2017年3月22日15:27 | #8

    不错的文章,内容言简意赅.禁止此消息:nolinkok@163.com

    [回复]

  9. 2017年3月22日15:28 | #9

    好文章,内容淋漓尽致.禁止此消息:nolinkok@163.com

    [回复]

  10. 2017年3月22日15:28 | #10

    不错的文章,内容学富五车.禁止此消息:nolinkok@163.com

    [回复]

  11. 2017年3月22日15:28 | #11

    好文章,内容文风幽默.禁止此消息:nolinkok@163.com

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.