忘记密码   免费注册 查看新帖 | 论坛精华区
ChinaUnix.net
  平台论坛 博客 微博 读书 人才 精华 文库 自测 | 频道操作系统 开发 数据库 存储 服务器 网络 IT新闻 Linux 下载 Power用户组
最近访问板块 发新帖
查看: 4143 | 回复: 30

谁能解释一下这个sed命令,太复杂了。。。 [复制链接]
更多

Rank: 5Rank: 5

帖子
1566
主题
194
精华
0
可用积分
7495
专家积分
220
在线时间
829 小时
注册时间
2007-10-11
最后登录
2011-07-15
论坛徽章:
0
发表于 2009-01-05 19:29:21 |显示全部楼层
输出匹配行的上行、匹配行、下行

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

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

推荐歌曲:NewDivide-LinkinPark

Rank: 8Rank: 8

帖子
3858
主题
2
精华
0
可用积分
20938
专家积分
396
在线时间
6194 小时
注册时间
2003-08-29
最后登录
2012-02-07
论坛徽章:
0
发表于 2009-01-05 19:32:18 |显示全部楼层
原帖由 ILoveMK 于 2009-1-5 19:29 发表
输出匹配行的上行、匹配行、下行

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

看不懂。。。

没有man,info?

先弄明白每个命令的含义
天行健,君子以自强不息
发奋忘食,乐以忘优,不知老之将至
温故而知新

Rank: 5Rank: 5

帖子
1566
主题
194
精华
0
可用积分
7495
专家积分
220
在线时间
829 小时
注册时间
2007-10-11
最后登录
2011-07-15
论坛徽章:
0
发表于 2009-01-05 19:37:03 |显示全部楼层
谢谢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

按我的分析是会输出最后一行的,为什么最后一行没有出来啊。。。
葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark
休息休息

Rank: 2

帖子
5954
主题
144
精华
2
可用积分
1980
专家积分
70
在线时间
1498 小时
注册时间
2008-06-03
最后登录
2011-08-10
论坛徽章:
0
发表于 2009-01-05 20:01:07 |显示全部楼层
俺也不懂,要不然就给你讲讲啦
long time no see ~

Rank: 8Rank: 8

帖子
3858
主题
2
精华
0
可用积分
20938
专家积分
396
在线时间
6194 小时
注册时间
2003-08-29
最后登录
2012-02-07
论坛徽章:
0
发表于 2009-01-05 20:02:01 |显示全部楼层

回复 #3 ILoveMK 的帖子

  1. sed -n -e '/reg/{x;1!p;g;$!N;p;D;}' -e h data.txt
  2.                     ->h: hold space 为空行,无输出
  3. aa                ->h: hold space 为aa,无输出
  4. 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,开始下一个循环,不读入内容

  5.                    ->/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
  6. eeee          ->h: 无输出
复制代码
天行健,君子以自强不息
发奋忘食,乐以忘优,不知老之将至
温故而知新
休息休息

Rank: 2

帖子
5954
主题
144
精华
2
可用积分
1980
专家积分
70
在线时间
1498 小时
注册时间
2008-06-03
最后登录
2011-08-10
论坛徽章:
0
发表于 2009-01-05 20:10:38 |显示全部楼层
俺知道结果是匹配行以及前后各一行的结果
long time no see ~

Rank: 5Rank: 5

帖子
1566
主题
194
精华
0
可用积分
7495
专家积分
220
在线时间
829 小时
注册时间
2007-10-11
最后登录
2011-07-15
论坛徽章:
0
发表于 2009-01-05 20:13:30 |显示全部楼层
我来说一下我的理解吧:
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这一行的,大家看看我的理解哪里错了额?谢谢。
葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark

Rank: 5Rank: 5

帖子
1566
主题
194
精华
0
可用积分
7495
专家积分
220
在线时间
829 小时
注册时间
2007-10-11
最后登录
2011-07-15
论坛徽章:
0
发表于 2009-01-05 20:18:24 |显示全部楼层
原帖由 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,开始下一个循环,不读入内容”

为什么开始下一个循环会不读取内容啊?
葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark

Rank: 8Rank: 8

帖子
3858
主题
2
精华
0
可用积分
20938
专家积分
396
在线时间
6194 小时
注册时间
2003-08-29
最后登录
2012-02-07
论坛徽章:
0
发表于 2009-01-05 20:22:14 |显示全部楼层
原帖由 ILoveMK 于 2009-1-5 20:18 发表

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

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

因为pattern space里有内容。D和d不一样。
天行健,君子以自强不息
发奋忘食,乐以忘优,不知老之将至
温故而知新

Rank: 5Rank: 5

帖子
1566
主题
194
精华
0
可用积分
7495
专家积分
220
在线时间
829 小时
注册时间
2007-10-11
最后登录
2011-07-15
论坛徽章:
0
发表于 2009-01-05 20:29:30 |显示全部楼层
原帖由 ynchnluiti 于 2009-1-5 20:22 发表

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

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

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

从上面看D和d的不同就是一个是删除pattern空间里的第一行,而另一个是全部删了,还有什么不同么?
葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark
您需要登录后才可以回帖 登录 | 注册

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP