一 上两个sed的处理图
简化版的
根据简化来分析sed命令对字符串的处理
(1) sed从输入文件中读'第一行到pattern space',pattern space中原来的内容(空的)被第一行数据覆盖
备注:如果有必要"备份"可以通过'h或H'加pattern space中的内容(第一行数据)copy或append到holdspace,如果以后不再对这个hold space做任何操作,那个这个数据就一直保持到文件处理结束
(2) 然后通过sed命令对pattern space中的数据进行'匹配处理',最后将匹配处理好的结果'保存到'patternspace中
(3) 最后从pattern space'输出'
----------------------- '默认行为说明' -----------------------
默认情况下,是会'自动打印'pattern space中内容
我们知道从step ①'送入'pattern的内容
如果'符合sed的处理条件 --> 模式匹配了',就会经过step ②和③的处理,'打印的内容'就是指经过step③处理的内容;
如果'不符'合,'也会'-->这是重点-->打印出step①送入的内容。
二 两个空间的概念
模式空间:保存'被sed命令处理过后'的的字符串!
保持空间:保持空间就是用来'备份模式空间'数据的,既然叫保持空间,所以只要你'备份在那',没有对它进行操作,这个保持空间里的数据就一直'保持不变'。
三 进入今天打印的重点
(1)n命令
解释:-n --> '抑制'pattern space的'自动打印'行为
问题:自动'打印了什么'? --> 打印的是-->经过模式空间'sed处理过后'和经过模式空间'没有经过处理的'
(2)p命令
明确两点:
1)如果'模式不匹配',该行记录'不会'进入'模式空间'
2)sed的p命令'非option参数'输出的是'经过sed命令处理过后'模式空间'返回的内容'
三 案例学习
(1)测试-n
s命令的flags(p)
(2)测试p命令
分析
输出结果:第二行'输出了两次'
原因:不管它'模式空间的内容'有没有经过sed处理,默认'不加 -n'都会'输出一次'
因为'第二行'正好匹配sed的处理条件,所以被输出一次,第二次是p输出的'强制输出经过sed处理的模式空间的内容'。
(3)打印偶数行
'n命令':简单来说就是'提前读取下一行','覆盖模型空间前一行',然后执行'后续命令' -->然后再读取新行,对新读取的内容重头执行sed
(4)打印奇数行