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
[root@localhost ~]# sed '\%/dev/md1%,\%/dev/md2%{/^1122 /d}' i
/dev/md1
1233 0:11 m
1234 0:13 m
/dev/md2
1122 0:1 m
1567 0:2 m
1678 0:3 m
[root@localhost ~]# cat i
/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
[root@localhost ~]#
复制代码
作者:
关阴月飞
时间:
2013-11-25 09:37
回复
1#
oniziga
awk '/\/dev\/md1/,/\/dev\/md2/{if(!/1122/)print;next}1' file
复制代码
作者:
秋天的絮儿
时间:
2013-11-25 09:38
sed -i '0,/^1122/{/^1122/d}' file
复制代码
作者:
秋天的絮儿
时间:
2013-11-25 09:38
sed -i '0,/^1122/{/^1122/d}' file
复制代码
作者:
bianlimit
时间:
2013-11-25 09:38
[root@FW tmp]# sed -e "/^\/dev\/md1/,/1122/d" aaa
1233 0:11 m
1234 0:13 m
/dev/md2
1122 0:1 m
1567 0:2 m
1678 0:3 m
复制代码
作者:
秋天的絮儿
时间:
2013-11-25 09:38
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
:/md1/,/md2/g/1122/d
不知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
/REGEXP/ 等价于 \%REGEXP%
%可以换成其他的符号,比如!、@、#、$等
因为楼主要匹配的内容里包含了斜杆,所以直接用//需要多次转义,而用其他符号则可避免这种情况。
复制代码
作者:
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