在进入正题之前我们先来了解一下sed的模式空间,如下
什么是sed的模式空间?
答(仅供参考):就是从文件读取一行文本然后存入的缓冲区,然后命令操作模式空间的内容,在初始状态下模式空间是没有内容的,在每次循环读取数据的过程中,模式空间都会被清空并写入新的内容。
首先给一个sed操作的图示:

解释以下命令结果:
要进一步理解sed的工作原理,弄清上面四个命令便足够了,大家不妨猜一下上面四条命令的输出结果......
不知道大家有没有猜对,不过结果如下:




我想应该不少人都会对上面的结果产生困惑,为了照顾到大部分人,我尽量啰嗦一点吧,如下
第一个命令:seq 10 | sed 'n;p'
解:命令“ seq 10 ”按顺序生成 1 到 10 的 10 行数据,通过管道命令“ | ”把结果传给 sed 命令来处理,
命令“ sed 'n;p' ”就会依次按行读入管道|传过来的数据,
第一轮 sed :
seq 把生成的“ 1 ”传给 sed ,现在 sed 的处理缓冲区就有数据“ 1 ”,有了数据“ 1 ”之后 sed 便执行单引号里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了(我一开始也搞不清楚),其实n命令就是读入下一行数据,在“ seq 10 | sed 'n;p' ”这里就是读入“ 2 ”,那原来的“ 1 ”怎么办呢(关键),sed会默认把不要的数据丢到stdout(标准输出,也就是屏幕)那里,所以就会在屏幕上打印出第一行数据“ 1 ”;得到了第一个输出然后命令还没结束!
刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 2 ”,所以直接打印“ 2 ”,现在我们的屏幕就有了2行数据了,分别是第一行:1,第二行:2
第一轮 sed 'n;p' 执行完毕。
第二轮 sed :
与上面上第一轮的差不多,如下:
seq 把生成的“ 3 ”传给 sed (是 3 不是 2, 不要乱了),(关键)sed 的缓冲区里面现在有“ 2 ”’,然后现在又读入了新的“ 3 ”,sed会默认把不要的数据(在这里就是 2 )丢到标准输出,所以这时屏幕打印第三行数据“ 2 ”,所以现在 sed 的处理缓冲区就有数据“ 3 ”,有了数据“ 3 ”之后 sed 便执行单引号里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了(我一开始也搞不清楚),其实n命令就是读入下一行数据,在“ seq 10 | sed 'n;p' ”这里就是读入“ 4 ”,那原来的“ 3 ”怎么办呢(关键),sed会默认把不要的数据丢到stdout(标准输出,也就是屏幕)那里,所以就会在屏幕上打印出第四行数据“ 3 ”;得到了第四个输出然后命令还没结束!
刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 4 ”,所以直接打印“ 4 ”,现在我们的屏幕就有了5行数据了,分别是第一行:1,第二行:2,第三行:2,第四行:3,第五行:4
第二轮 sed 'n;p' 执行完毕。
剩下来的都和上面一样我就不啰嗦了(第一次写这么多,有点累了-_-||)
以上就是对 seq 10 | sed 'n;p' 命令的详细分析
再贴一次结果:

第二个命令:seq 10 | sed -n 'n;p'
第二个命令与第一个命令几乎一样,只是 sed 多了一个选项 -n ,(相信只要理解了第一个命令,现在这个就so easy了)
首先理解 -n 的意思,就是只打印处理过的数据,在这里再通俗点说就是sed缓冲区里不要的数据就不要丢到标准输出了,你爱丢哪丢哪!
下面过一遍流程:
第一轮 sed :
seq 把生成的“ 1 ”传给 sed ,现在 sed 的处理缓冲区就有数据“ 1 ”,有了数据“ 1 ”之后 sed 便执行单引号里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了(我一开始也搞不清楚),其实n命令就是读入下一行数据,在“ seq 10 | sed -n 'n;p' ”这里就是读入“ 2 ”,那原来的“ 1 ”怎么办呢(关键),这时 sed 就不会把“ 1 ”丢到标准输出了,所以屏幕上不会输出“ 1 ”,
刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 2 ”,所以直接打印“ 2 ”,现在我们的屏幕就有1行数据了,第一行:2
第一轮 sed 'n;p' 执行完毕。
第二轮 sed :
与上面上第一轮的差不多,如下:
seq 把生成的“ 3 ”传给 sed ,(关键)sed 的缓冲区里面现在有“ 2 ”’,然后现在又读入了新的“ 3 ”,这时 sed 就不会把“ 2 ”丢到标准输出了,所以屏幕上不会输出“ 2 ”,所以现在 sed 的处理缓冲区就有数据“ 3 ”,有了数据“ 3 ”之后 sed 便执行单引号里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了,其实n命令就是读入下一行数据,在“ seq 10 | sed 'n;p' ”这里就是读入“ 4 ”,那原来的“ 3 ”怎么办呢(关键),sed 也不会把“ 2 ”丢到标准输出了,所以屏幕上也不会输出“ 2 ,”然后命令还没结束!
刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 4 ”,所以直接打印“ 4 ”,现在我们的屏幕就有了5行数据了,分别是第一行:2,第二行:4
第二轮 sed 'n;p' 执行完毕。
再贴一次结果:

相信看到这里的童鞋都应该有所收获了,如果没有那一定是我的问题,对不起!!!
剩下两个命令我觉得就没有必要再啰嗦了,相信大家可以自行推导,如果还有什么不懂的可以私信我,看到就回!
第一次码这么多字,希望能对大家有所帮助,在此特地感谢李老师的讲解,可以说全是他的深入讲解的功劳!!!
码字不易,你们的
是激励我继续分享的动力,如果有任何问题,欢迎评论区留言!
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="