Chinaunix
标题:
sed缓冲区里行号是不是就不是按原本的理解方式了
[打印本页]
作者:
gaoshoupei
时间:
2012-03-19 16:13
标题:
sed缓冲区里行号是不是就不是按原本的理解方式了
假设删除几行之后的结果如下
# sed -e '1,/value/d' file
192.168.1.1
192.168.1.2
如果想打印删除之后第一行的结果一开始的命令写成
# sed -e '1,/value/d' -n -e '1p' file
没有任何输出
# sed -e '1,/value/d' -n -e '2p' file
没有任何输出
但是如果写成
# sed -e '1,/value/d' -n -e '1,2p' file
192.168.1.1
能打印出东西
求解释~不针对解决问题的合理性只想问下这种现象的原因
作者:
hbmhalley
时间:
2012-03-19 16:26
估计lz发现bug了
sh.exe"-3.1$ echo 'a
> b
> c' | sed -ne '1,2d;1,2p;'
c
sh.exe"-3.1$ echo 'a
> b
> c' | sed -ne '1,2d;3p;'
c
复制代码
作者:
gaoshoupei
时间:
2012-03-19 16:36
回复
2#
hbmhalley
额,什么意思? sed本身的bug?
作者:
regansong
时间:
2012-03-19 17:01
命令行下多个-e命令相当于将一个命令组应用于sed中pattern space中的每一行.
当pattern space中输入一行,第一条命令判断是否输入行是否是第一行与第一次出现value的行之间,如果是则删除pattern space中的该行输入内容,因为pattern space中没有内容了,
会导致控制流回到sed命令组的顶端也即第一条命令
.
这个跟多行删除D命令是不一样的意思.
因此:
输入文件:
1
value
192.168.1.1
192.168.1.2
命令:
sed -e '1,/value/d' -ne '3p' testfile
输出:
192.168.1.1
但:
sed -e '1,/value/d' -ne '1,2p' testfile 无法输出你想要的结果.
复制代码
这就是sed的处理机制,不算bug吧,个人理解,请指正.
作者:
hbmhalley
时间:
2012-03-19 18:14
回复
3#
gaoshoupei
对.
回复
4#
regansong
解释下2L的'c'到底是第二行还是第三行吧
作者:
nuclearxin
时间:
2012-03-19 18:16
这个d干里什么呢~~~~~
看man
d Delete pattern space. Start next cycle.
作者:
hbmhalley
时间:
2012-03-19 18:48
回复
6#
nuclearxin
问题是 p 为什么会起作用
作者:
zooyo
时间:
2012-03-19 19:14
提示:
作者被禁止或删除 内容自动屏蔽
作者:
hbmhalley
时间:
2012-03-19 19:23
回复
8#
zooyo
可事实是执行 p 了。怎么解释
作者:
winway1988
时间:
2012-03-19 19:31
[winway@winway test]$ cat urfile
a
b
c
d
e
f
[winway@winway test]$ sed -n '1,2d;=;1,2p' urfile
3
c
4
5
6
复制代码
为什么对于第三行,能满足1,2这个条件,而打印c
作者:
zooyo
时间:
2012-03-19 19:34
提示:
作者被禁止或删除 内容自动屏蔽
作者:
hbmhalley
时间:
2012-03-19 20:51
回复
11#
zooyo
不懂 .. 求传送门
还有, 2L 怎么解释?[1,2]∩[3]≠{} ?
作者:
zooyo
时间:
2012-03-19 21:52
提示:
作者被禁止或删除 内容自动屏蔽
作者:
hbmhalley
时间:
2012-03-19 21:56
回复
13#
zooyo
我想弄清楚为什么居然会有东西被打印出来。1,2d;1,2p; 后面这个1,2p;不应该是废话么?
作者:
zooyo
时间:
2012-03-19 23:11
提示:
作者被禁止或删除 内容自动屏蔽
作者:
blackold
时间:
2012-03-19 23:23
本帖最后由 blackold 于 2012-03-19 23:24 编辑
回复
14#
hbmhalley
不是。
对于 lineNumber1, lineNumber2 这样的地址对,如果当前行号cNumber大于等于 lineNumber1,则为视为匹配。
对于第二个数字,如果它小于或等于匹配第一个数字的行号,则只匹配一行。
当读到第3行时,当前行号为 3, 那么对于第二个 1,2p,因为3>1,所以匹配,进入地址对。
而2却小于3,所以只匹配一行,即第3行。
作者:
hbmhalley
时间:
2012-03-19 23:25
回复
15#
zooyo
不明白。什么叫 `d没有执行' ?
换句话说,怎么解释 '1,2d;1,2p;' 和 '1,2d;1p;2p;' 的结果不一样?
作者:
zooyo
时间:
2012-03-19 23:29
提示:
作者被禁止或删除 内容自动屏蔽
作者:
hbmhalley
时间:
2012-03-19 23:34
回复
18#
zooyo
回复
16#
blackold
多谢!懂了.
可是这是故意设定成这样的么?无论如何都觉得1,2p打印第三行非常荒诞
作者:
blackold
时间:
2012-03-19 23:36
可以参考以前的讨论
http://bbs.chinaunix.net/thread-3557086-1-1.html
作者:
hbmhalley
时间:
2012-03-20 00:05
真是不懂了
sh.exe"-3.1$ echo 'a
> b
> c' | sed '/a/,/b/{/b/d}'
a
c
复制代码
说明对于/a/,/b/中/b/的判断在{}开始前而非结束后,否则/b/d应当跳过对外层/b/的判断
如果是这样,那么`1,2p;' 在p生效之前就已经知道p命令结束于第二行,那么有什么理由假装不知道还要留个后门给当前行,生米煮成稀饭了才发现 `卧槽让这小子捡漏了'
作者:
yinyuemi
时间:
2012-03-20 08:56
回复
19#
hbmhalley
sed的这种用法类似于perl的...操作符,叫"filp-flop"
http://perldoc.perl.org/perlop.html#Range-Operators
作者:
blackold
时间:
2012-03-20 09:24
回复
21#
hbmhalley
行号寻址和正则寻址是不同的。看下面的例子:
$ cat urfile
a
b
c
d
e
f
$ sed '1,2d;' urfile
c
d
e
f
$ sed '1,2d;=' urfile
3
c
4
d
5
e
6
f
$ sed '1,2d;=;1,2d;' urfile
3
4
d
5
e
6
f
$ sed '1,2d;=;1,2d;1,2d;' urfile
3
4
5
e
6
f
复制代码
作者:
blackold
时间:
2012-03-20 09:28
回复
22#
yinyuemi
反了吧,应该说 Perl 与 sed 和 awk 相似。
作者:
yinyuemi
时间:
2012-03-20 09:45
回复
24#
blackold
黑哥正解
作者:
blackold
时间:
2012-03-20 10:09
本帖最后由 blackold 于 2012-03-20 10:09 编辑
回复
25#
yinyuemi
技术版就是好!拿1分再说
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2