BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 



谁能解释一下这个sed命令,太复杂了。。。
首页 » 论坛 » Shell »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
ILoveMK   帅哥
天使


CU奥运火炬传递手2008
CU编号: 627235
注册:2007-10-11
最后登录: 2009-07-05
帖子:1386
精华:0

可用积分:4416 (小富即安)
信誉积分:0
专家积分:55 (本版:10)
空间积分:810
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2009-1-5 19:29 

输出匹配行的上行、匹配行、下行

sed -n -e '/regexpr/{x;1!p;g;$!N;p;D;}' -e h

看不懂。。。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark
ynchnluiti (andy)
精灵使



CU编号: 90672
注册:2003-8-29
最后登录: 2009-07-03
帖子:3715
精华:0

可用积分:24776 (巨富豪门)
信誉积分:100
专家积分:646 (本版:190)
空间积分:0
推广积分:1456

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2009-1-5 19:32 



QUOTE:
原帖由 ILoveMK 于 2009-1-5 19:29 发表
输出匹配行的上行、匹配行、下行

sed -n -e '/regexpr/{x;1!p;g;$!N;p;D;}' -e h

看不懂。。。

没有man,info?

先弄明白每个命令的含义



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

天行健,君子以自强不息
发奋忘食,乐以忘优,不知老之将至
温故而知新
ILoveMK   帅哥
天使


CU奥运火炬传递手2008
CU编号: 627235
注册:2007-10-11
最后登录: 2009-07-05
帖子:1386
精华:0

可用积分:4416 (小富即安)
信誉积分:0
专家积分:55 (本版:10)
空间积分:810
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2009-1-5 19:37 

谢谢andy,我每个命令都看了,大概也理解了,不过还是转不过弯:

cat data.txt

aa
regdd
regbb
ccdd
eeee

sed -n -e '/reg/{x;1!p;g;$!N;p;D;}' -e h data.txt
输出结果:
aa
regdd
regbb
regdd
regbb
ccdd

按我的分析是会输出最后一行的,为什么最后一行没有出来啊。。。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark
我是DBA (好运)
法师
休息休息



CU编号: 713644
注册:2008-6-3
最后登录: 2009-07-04
帖子:5812
精华:2

可用积分:11333 (大富大贵)
信誉积分:30
专家积分:95 (本版:65)
空间积分:808
推广积分:30

来自:厦门
状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2009-1-5 20:01 

俺也不懂,要不然就给你讲讲啦



您对本贴的看法:鲜花[0] 臭蛋[0]
ynchnluiti (andy)
精灵使



CU编号: 90672
注册:2003-8-29
最后登录: 2009-07-03
帖子:3715
精华:0

可用积分:24776 (巨富豪门)
信誉积分:100
专家积分:646 (本版:190)
空间积分:0
推广积分:1456

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2009-1-5 20:02 

回复 #3 ILoveMK 的帖子



sed -n -e '/reg/{x;1!p;g;$!N;p;D;}' -e h data.txt
                    ->h: hold space 为空行,无输出
aa                ->h: hold space 为aa,无输出
regdd           ->/reg/成立。x: hold space 为regdd, pattern space为aa; 1!p输出aa; g: pattern space为regdd; $!N: 读入regbb, pattern space 为 regdd\regbb; p: 输出regdd\nregbb;D:pattern space为regbb,开始下一个循环,不读入内容

                   ->/reg/成立。x: hold space为regbb, pattern space为regdd; 1!p:输出regdd; g: pattern space 为regbb; $!N: 读入ccdd, pattern space为regbb\nccdd; p:输出regbb\nccdd;D: pattern space为ccdd
eeee          ->h: 无输出




您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

天行健,君子以自强不息
发奋忘食,乐以忘优,不知老之将至
温故而知新
我是DBA (好运)
法师
休息休息



CU编号: 713644
注册:2008-6-3
最后登录: 2009-07-04
帖子:5812
精华:2

可用积分:11333 (大富大贵)
信誉积分:30
专家积分:95 (本版:65)
空间积分:808
推广积分:30

来自:厦门
状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2009-1-5 20:10 

俺知道结果是匹配行以及前后各一行的结果



您对本贴的看法:鲜花[0] 臭蛋[0]
ILoveMK   帅哥
天使


CU奥运火炬传递手2008
CU编号: 627235
注册:2007-10-11
最后登录: 2009-07-05
帖子:1386
精华:0

可用积分:4416 (小富即安)
信誉积分:0
专家积分:55 (本版:10)
空间积分:810
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2009-1-5 20:13 

我来说一下我的理解吧:
1.读入第一行,没有reg,把aa复制到hold space,并清空pattern space的内容。(h:aa p:空)

2.读入第二行(p:regdd),匹配到reg,交换h space和p space的内容(h:regdd p:aa),并把p space的内容打印到屏幕上,把h space的内容复制到p space,读入第三行(regdd\nregbb),打印p space的内容,并删除第一个换行符前的内容,后面的命令不执行。(h:regdd  p:regbb)
此时屏幕上应该打印出:
aa
regdd
regbb

3.读入第四行(p:regbb\nccdd),匹配到reg,交换h space和p space的内容(h:regbb\nccdd p:regdd),并把p space的内容打印到屏幕上,把h space的内容复制到p space,读入第五行(regbb\nccdd\neeee),打印p space的内容,并删除第一个换行符前的内容,后面的命令不执行。(h:regbb\nccdd  p:nccdd\neeee)

此时屏幕的输出应该是:
aa
regdd
regbb
regdd
regbb
ccdd
eeee

可实际上是没有eeee这一行的,大家看看我的理解哪里错了额?谢谢。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark
ILoveMK   帅哥
天使


CU奥运火炬传递手2008
CU编号: 627235
注册:2007-10-11
最后登录: 2009-07-05
帖子:1386
精华:0

可用积分:4416 (小富即安)
信誉积分:0
专家积分:55 (本版:10)
空间积分:810
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2009-1-5 20:18 



QUOTE:
原帖由 ynchnluiti 于 2009-1-5 20:02 发表

sed -n -e '/reg/{x;1!p;g;$!N;p;D;}' -e h data.txt
                    ->h: hold space 为空行,无输出
aa                ->h: hold space 为aa,无输出
regdd           ->/reg/成立。x: hold space 为 ...

非常感谢,我看了下,这个不理解:
“D:pattern space为regbb,开始下一个循环,不读入内容”

为什么开始下一个循环会不读取内容啊?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark
ynchnluiti (andy)
精灵使



CU编号: 90672
注册:2003-8-29
最后登录: 2009-07-03
帖子:3715
精华:0

可用积分:24776 (巨富豪门)
信誉积分:100
专家积分:646 (本版:190)
空间积分:0
推广积分:1456

状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2009-1-5 20:22 



QUOTE:
原帖由 ILoveMK 于 2009-1-5 20:18 发表

非常感谢,我看了下,这个不理解:
“D:pattern space为regbb,开始下一个循环,不读入内容”

为什么开始下一个循环会不读取内容啊?

因为pattern space里有内容。D和d不一样。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

天行健,君子以自强不息
发奋忘食,乐以忘优,不知老之将至
温故而知新
ILoveMK   帅哥
天使


CU奥运火炬传递手2008
CU编号: 627235
注册:2007-10-11
最后登录: 2009-07-05
帖子:1386
精华:0

可用积分:4416 (小富即安)
信誉积分:0
专家积分:55 (本版:10)
空间积分:810
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2009-1-5 20:29 



QUOTE:
原帖由 ynchnluiti 于 2009-1-5 20:22 发表

因为pattern space里有内容。D和d不一样。

谢谢,能不能把你那个D命令的man贴出来啊,我的man说得很简单,没有提到这点:

D:Delete initial segment of pattern space through first new-line and start the next cycle.

从上面看D和d的不同就是一个是删除pattern空间里的第一行,而另一个是全部删了,还有什么不同么?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark

首页 » 论坛 » Shell »


 


Copyright © 2001-2009 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.053964 second(s), 4 queries , Gzip enabled