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


谁能解释一下这个sed命令,太复杂了。。。

  首页 » 论坛 » Shell »
[打印] [收藏] [本帖文本页] [推荐此主题给朋友]

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

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

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

推荐歌曲:NewDivide-LinkinPark





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

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

看不懂。。。


没有man,info?

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



谢谢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



俺也不懂,要不然就给你讲讲啦
__________________________________
long time no see ~



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



俺知道结果是匹配行以及前后各一行的结果
__________________________________
long time no see ~



我来说一下我的理解吧:
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





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,开始下一个循环,不读入内容”

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

推荐歌曲:NewDivide-LinkinPark





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

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

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


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





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空间里的第一行,而另一个是全部删了,还有什么不同么?
__________________________________
葡萄美酒夜光杯,欲饮琵琶马上催。
醉卧沙场君莫笑,古来征战几人回。

推荐歌曲:NewDivide-LinkinPark


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

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

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP