Chinaunix

标题: 如何删除指定行之间的匹配行? [打印本页]

作者: oniziga    时间: 2013-11-25 09:30
标题: 如何删除指定行之间的匹配行?
本帖最后由 oniziga 于 2013-11-26 14:17 编辑

有如下的文本内容:
/dev/md1
1122 0:12 m
1233 0:11 m
1234 0:13 m
/dev/md2
1122 0:1 m
1567 0:2 m
1678 0:3 m

要删除/dev/md1和/dev/md2之间的这个1122这行,而不是删除/dev/md2下面这个1122.


++++++++++++++++++++++++++++++++++++++++++++++++++++++++

之前问题解决了,继续追问,如果要输出/dev/md1到下一个/dev/mdx之间行的第二列呢?
例子中就是
1122 0:12 m
1233 0:11 m
1234 0:13 m


作者: oniziga    时间: 2013-11-25 09:34
sed  ‘/md1/, /md2/1122d' file提示有语法错误
作者: yestreenstars    时间: 2013-11-25 09:36
  1. [root@localhost ~]# sed '\%/dev/md1%,\%/dev/md2%{/^1122 /d}' i
  2. /dev/md1
  3. 1233 0:11 m
  4. 1234 0:13 m
  5. /dev/md2
  6. 1122 0:1 m
  7. 1567 0:2 m
  8. 1678 0:3 m
  9. [root@localhost ~]# cat i
  10. /dev/md1
  11. 1122 0:12 m
  12. 1233 0:11 m
  13. 1234 0:13 m
  14. /dev/md2
  15. 1122 0:1 m
  16. 1567 0:2 m
  17. 1678 0:3 m
  18. [root@localhost ~]#
复制代码

作者: 关阴月飞    时间: 2013-11-25 09:37
回复 1# oniziga
  1. awk '/\/dev\/md1/,/\/dev\/md2/{if(!/1122/)print;next}1' file
复制代码

作者: 秋天的絮儿    时间: 2013-11-25 09:38
  1. sed -i '0,/^1122/{/^1122/d}' file
复制代码

作者: 秋天的絮儿    时间: 2013-11-25 09:38
  1. sed -i '0,/^1122/{/^1122/d}' file
复制代码

作者: bianlimit    时间: 2013-11-25 09:38
  1. [root@FW tmp]# sed -e "/^\/dev\/md1/,/1122/d" aaa
  2. 1233 0:11 m
  3. 1234 0:13 m
  4. /dev/md2
  5. 1122 0:1 m
  6. 1567 0:2 m
  7. 1678 0:3 m
复制代码

作者: 秋天的絮儿    时间: 2013-11-25 09:38
  1. sed -i '0,/^1122/{/^1122/d}' file
复制代码

作者: 秋天的絮儿    时间: 2013-11-25 09:41
刷新了一下怎么出现这么多啊?能不能删除啊?
作者: oniziga    时间: 2013-11-25 09:42
谢谢楼上的,关键是{/1111/d}原来要用大括号括起来。
作者: q1208c    时间: 2013-11-25 09:44
楼主如果只是要简单的删除这一行, vi一下就可以了呀, 有这么麻烦么?
作者: 这个冬天不冷    时间: 2013-11-25 09:48
  1. :/md1/,/md2/g/1122/d
  2. 不知vim行不
复制代码

作者: 零下五度_    时间: 2013-11-25 10:53
回复 4# 关阴月飞

想请问下这行代码next后面的1是什么意思?谢谢


   
作者: 关阴月飞    时间: 2013-11-25 10:57
回复 13# 零下五度_

  基础中的基础:
    1==》 1{print $0} ==> {print $0}  
作者: 零下五度_    时间: 2013-11-25 11:20
回复 14# 关阴月飞

谢谢。


   
作者: fantingftt123    时间: 2013-11-26 00:00
回复 3# yestreenstars
lz,这里的%是什么意思啊?

   
作者: yestreenstars    时间: 2013-11-26 09:07
回复 16# fantingftt123
  1. /REGEXP/    等价于    \%REGEXP%

  2. %可以换成其他的符号,比如!、@、#、$等

  3. 因为楼主要匹配的内容里包含了斜杆,所以直接用//需要多次转义,而用其他符号则可避免这种情况。
复制代码

作者: oniziga    时间: 2013-11-26 14:29
顶上去:wink::wink::wink::wink::wink::wink:
作者: oniziga    时间: 2013-11-26 14:34
自己搞定了:
sed  -n '/md1/,/md/{/md1/n;/md/b;p}' file | awk ’{print $2}‘

不知道有没有更简单一点的方法
作者: rulebook    时间: 2013-11-26 14:43
sed -r '/\/dev\/md1/,/\/dev\/md2/{/1122/d}'
作者: jason680    时间: 2013-11-26 14:56
回复 1# oniziga

How about this one and  maintain it easily

$ awk -vD=/dev/md1 -vT=1122 'NF==1{dev=$1}D==dev{P=($1==T)?1:0}!P' FILE
/dev/md1
1233 0:11 m
1234 0:13 m
/dev/md2
1122 0:1 m
1567 0:2 m
1678 0:3 m

   
作者: fantingftt123    时间: 2013-11-29 20:57
回复 3# yestreenstars
lz,那%前面的那个\是对%这个符号进行转义,那后面那个%不需要吗?


   
作者: yestreenstars    时间: 2013-11-29 22:48
回复 22# fantingftt123
不需要,参考info sed~

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2