深入理解sed模式空间——sed 'n;p'

  • 深入理解sed模式空间——sed 'n;p'已关闭评论
  • 163 次浏览
  • A+
所属分类:linux技术
摘要

在进入正题之前我们先来了解一下sed的模式空间,如下什么是sed的模式空间?

在进入正题之前我们先来了解一下sed的模式空间,如下

什么是sed的模式空间?

答(仅供参考):就是从文件读取一行文本然后存入的缓冲区,然后命令操作模式空间的内容,在初始状态下模式空间是没有内容的,在每次循环读取数据的过程中,模式空间都会被清空并写入新的内容。

 

解释以下命令结果:

  1. seq 10 | sed 'n;p'
  2. seq 10 | Sed -n 'n;p'
  3. seq 10 | sed 'p;n'
  4. seq 10 | sed -n p;n'

要进一步理解sed的工作原理,弄清上面四个命令便足够了,大家不妨猜一下上面四条命令的输出结果......

不知道大家有没有猜对,不过结果如下:

深入理解sed模式空间——sed 'n;p'

深入理解sed模式空间——sed 'n;p'

深入理解sed模式空间——sed 'n;p'

深入理解sed模式空间——sed 'n;p'

我想应该不少人都会对上面的结果产生困惑,为了照顾到大部分人,我尽量啰嗦一点吧,如下

第一个命令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' 命令的详细分析

再贴一次结果:

深入理解sed模式空间——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' 执行完毕。

再贴一次结果:

深入理解sed模式空间——sed 'n;p'

 

相信看到这里的童鞋都应该有所收获了,如果没有那一定是我的问题,对不起!!!

剩下两个命令我觉得就没有必要再啰嗦了,相信大家可以自行推导,如果还有什么不懂的可以私信我,看到就回!

第一次码这么多字,希望能对大家有所帮助,在此特地感谢李老师的讲解,可以说全是他的深入讲解的功劳!!!

 码字不易,你们的深入理解sed模式空间——sed 'n;p'是激励我继续分享的动力,如果有任何问题,欢迎评论区留言!