Linux - sed命令的N;P用法

目录

 sed命令 – 批量编辑文本文件

 sed工作原理

 n/N p/P动作的意义

 sed 'n;p'

 sed 'N;p'

 sed 'n;P'

 seq 'N;P'

 sed 'p;n'

 剩下的三个自己思考8


sed命令 – 批量编辑文本文件

sed命令来自于英文词组“stream editor”的缩写,其功能是用于利用语法/脚本对文本文件进行批量的编辑操作。sed命令最初由贝尔实验室开发,后被众多Linux系统接纳集成,能够通过正则表达式对文件进行批量编辑,让需要重复的工作不再浪费时间。

语法格式:sed 参数 文件

常用参数:

-e或--expression=<script>以指定的脚本来处理输入的文本文件
-f<script文件>或--file=<script文件>以指定的脚本文件来处理输入的文本文件
-h或--help显示帮助
-n或--quiet或--silent仅显示script处理后的结果
-V或--version显示版本信息

模式:以关键词sed开始,以某文件结尾,中间给出条件和动作,用两个单引号包住。


sed工作原理

sed 是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。sed 是逐行读取文本的,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i参数使执行结果更新原文件。

-n能取消sed的默认输出。不使用-n时,sed首先读取一行,并默认将缓冲区内的文本输出出来,之后p子命令再次输出。使用-n时,默认输出取消,只有p子命令的输出结果。


n/N p/P动作的意义

翻译如下:

n  读取下一行到模式空间

N  追加下一行到模式空间

p  打印当前模式空间

P  打印当前模式空间的第一part

n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出).

N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符.

了解了动作的意义之后,再通过几个例子加深理解。


sed 'n;p'

执行过程分析:

“seq 10"按序生成1-10,通过管道传给下一个命令sed执行。

sed 第一次处理 :

seq 把生成的"1"传给 sed ,即当前模式空间内容为"1",之后先执行命令n,读入下一行数据"2",原来的”1“将会从模式空间中被送往屏幕默认输出,即分析所写默认输出"1",此时模式空间内容为"2"。接着执行命令p,打印模式空间内容(即"2"),即分析所写p输出2。

sed 第二次处理:
sed每处理完一行,都会接着处理下一行,这样不断重复,直至文件末尾。此时sed读入下一行数据"3",原来的”2“将会从模式空间中被送往屏幕默认输出,即分析所写默认输出"2",此时模式空间内容为"3"。之后先执行命令n,读入下一行数据"4",原来的”1“将会从模式空间中被送往屏幕默认输出,即分析所写默认输出"3",此时模式空间内容为"4"。接着执行命令p,打印模式空间内容(即"4"),即分析所写p输出4。

sed 第X次处理则由读者自行思考并核对分析以验证。

 此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出,该命令即为选择偶数项:

Q:模式空间里明明有5,sed也默认输出了,p的作用是打印当前模式空间,那为什么分析的p输出中没有5呢?

A:5没有输出。是的,这是为什么呢?可以info sed看看n的解释“If there is no more input then 'sed' exits without processing any more commands.”,如果没有可以读取的内容,那么sed将不会处理后面的任何命令。当sed读到5的时候,已经没有下一行内容了,那么n将退出,也不再执行后面的p。所以5没有输出。

 seq命令 - 打印数字序列

seq命令用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且可以对整数的格式、宽度、分割符号进行控制。


sed 'N;p'

此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出:

Q:模式空间里明明有5,sed也默认输出了,p的作用是打印当前模式空间,那为什么分析的p输出中没有5呢?

A:5没有输出。是的,这是为什么呢?可以info sed看看N的解释“If there is no more input then 'sed' exits without processing any more commands.”,如果没有可以追加的内容,那么sed将不会处理后面的任何命令。当sed读到5的时候,已经没有下一行内容了,那么N将退出,也不再执行后面的P。所以5没有输出。


 sed 'n;P'

此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出: 

可以看到该命令执行结果与 seq 5 |sed 'n;p' 一致,这是因为P是打印模式空间中的part 1,而情况中模式空间just one part,导致结果显示一致。


 seq 'N;P'

此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出:

Q:如果我想用该命令打印奇数行怎么办? 它并不会输出5.

A:用  $!N,让N对最后一行不起作用,这样P就能继续执行。


sed 'p;n'

此时我们将-n加上,即去掉sed的默认输出,可以看到输出刚好符合所分析的p输出,该命令则为选择奇数项:


剩下的三个自己思考8

qaq

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值