LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: tqbhit

请教 如何删除2个关键字中间所有的行

[复制链接]
发表于 2006-4-5 12:59:17 | 显示全部楼层
一个方法:

sed '/start/,/end/c\
start\
end\
'
还可以在vi中这样:

: /start/+1, /end/-1 d
回复 支持 反对

使用道具 举报

发表于 2006-4-7 12:19:17 | 显示全部楼层
受 seamonkey 的启发, 只要再改一个地方就可以匹配任意多对了:

sed -n -e '1,/start/p' -e '/end/,/start/p' somefile
Post by seamonkey
sed -n -e '1,/start/p' -e '/end/,$p' somefile

只有一对匹配,这个就够了。
回复 支持 反对

使用道具 举报

发表于 2006-4-7 15:05:48 | 显示全部楼层
前提是最后一个start必须有相应的end匹配。

比如


  1. 111
  2. 222
  3. start
  4. 333
  5. 444
  6. end
  7. 555
  8. start
  9. 666
  10. 777
  11. end
  12. 888
  13. start
  14. 999
复制代码


最后的start没有end匹配, 999就被吃掉了。
回复 支持 反对

使用道具 举报

发表于 2006-4-7 16:33:08 | 显示全部楼层
我觉得还是用for 来循环,一行一行去读取,然后遇到非start就>>给newfile,遇到start就把start追加上去,然后就下一行丢弃,知道end在继续追加.
start和end的匹配就用一个变量来控制,如果变量为1表示已经有一个start没有匹配了,在等待end,如果为0就是等待start.
但是有一个问题就是如果文件第一行就是end怎么办?算谁的?
回复 支持 反对

使用道具 举报

发表于 2006-4-7 16:42:45 | 显示全部楼层
我觉得还是用for 来循环,一行一行去读取,然后遇到非start就>>给newfile,遇到start就把start追加上去,然后就下一行丢弃,知道end在继续追加.
start和end的匹配就用一个变量来控制,如果变量为1表示已经有一个start没有匹配了,在等待end,如果为0就是等待start.
但是有一个问题就是如果文件第一行就是end怎么办?算谁的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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