sed的N;P用法

原文地址

这里介绍的是sed的一个多行模式的使用,一开始对sed中命令N的用法不是很理解,经过多次尝试,通过几个例子对N的用法进行总结:

N即Next,它同n(next)的区别是:N命令将下一行追加到模式空间中,不打印模式空间的值,而使用n是打印当前模式空间的内容,并且读取下一行

蒙受启发
> cat num
1
2
3
4
5
6
7
8
9
> sed ’N;$!D’ num
8
9
> 执行过程详解: 首先解释重要的几个命令的用途: D删除模板块的第一行 并返回脚本头部执行 $ 锚定行的结束 如:/sed$/匹配所有以sed结尾的行 ,继续执行 ! 表示后面的命令对所有没有被选定的行发生作用。
大概说一下:
N;$!D
首先读入第一行: 1 (注:这不是N命令读入的)
执行N,读入第2行,追加到1后面,成了1\n2;
$!D,不是最后一行,所以执行D,模式空间由1\n2成了2, 控制流返回脚本第一条命令,即N。这样一直执行
….
直到执行N读入第9行:9,这里模式空间为:8\n9
$!D,因为是最后一行,所以不执行D,控制流到达脚本底部,输出模式空间的内容:
8
9 上面这段例子摘自网络,给了我很大启发,另外测试如下: 关于N: append the next line of input into the pattern space. 这是sed用户手册当中说的,很明显,意思是将当前读入行的下一行读取到当前的模式空间。 关于P: Print up to the first embedded newline of the current pattern space.打印当前模式空间中的第一块。 关于D: Delete up to the first embedded newline in the pattern space. Start next cycle, but skip reading from the input if there is still data in the pattern space. 删除当前模式空间的第一块,重新开始下一次循环,这个在后面例子中给予验证: 各种验证
验证一:NP结合 > cat num
1
2
3
4
> sed ’N;P’ num
1
1
2
3
3
4 > sed ’N;p’ num
1
2
1
2
3
4
3
4 对于上面的结果给予解释:P用于打印当前模式空间的第一块,而p打印整个当前模式空间。所以当使用P的时候,步骤如下:首先sed默认的读取1,模式空间为1,让你后执行N,模式空间变成1\n2\n,然后执行P,也就是打印1\n;当前行的处理,打印模式空间也就是1\n2\n;这时sed再从文件中读取下一行,也就到了3\n,执行N;模式空间变成了3\n4\n; 执行P;打印3\n;继续执行当前行的处理,打印模式空间3\n4\n;sed再从文件中读取下一行,发现没有了,结束处理流程。对于小p,和d大P的区别了解的话也就不难理解了。 验证二:ND结合 > cat num
1
2
3
4
> sed ’N;D’ num
4
> sed ’N;d’ num
> 对于D;删除当前模式空间第一块,并且返回命令开始继续执行。上述结果解释如下: 首先sed读取一行1\n;执行到N;模式空间为1\n2\n;执行D;模式空间变为:2\n;跳到前面继续执行N;模式空间变为2\n3\n;执行D;模式空间变为:3\n;跳回继续执行N;模式空间变为:3\n4\n;接着执行D;模式空间变为:4\n;跳回执行N的时候发现没有了下一行,所以跳出循环,接着sed继续处理,打印4\n;sed继续再读取文件的时候没有数据,所以结束处理。 验证3:NpD,再验证 > cat num
1
2
3
4
> sed ’N;p;D’ num
1
2
2
3
3
4
4 首先,sed读取一行,执行到N;模式空间为:1\n2\n;执行p;打印1\n2\n;执行D;模式空间变为:2\n;跳回执行N;模式空间变为:2\n3\n;执行p;打印2\n3\n;执行D;模式空间变为:3\n;跳回执行N;模式空间变为:3\n4\n;执行p;打印3\n4\n;执行D;模式空间变为:4\n;跳回执行N;没有数据。跳出循环,sed继续处理,默认打印模式空间所有数据4\n; 因此只有1打印一遍,其余行都打印2遍。 另外d和大D的区别了解以后也就明白了。 总结体会:sed处理始终在一个模式空间中进行,而且对于待处理文件,N读取了文件中的一行后,sed继续处理的时候应该是接着去读取,这里我理解是sed读取文件和N读取文件这些的共用一个指针。 在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。 常用命令: 利用sed给每行添加行号。 > cat passwd uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
mqq:x:1000:100::/usr/local/app:/bin/bash
mysql:x:1001:1001::/home/mysql:/bin/bash
natpan:x:1002:100::/data/natpan:/bin/bash
nagios:x:1003:100::/home/nagios:/bin/bash
nagios:x:1003:100::/home/nagios:/bin/bash
nagios:x:1003:100::/home/nagios:/bin/bash
给每行加上行号,命令如下:
> sed = passwd | sed ’N;s/\n/: /g’
1: uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
2:
3: mqq:x:1000:100::/usr/local/app:/bin/bash
4: mysql:x:1001:1001::/home/mysql:/bin/bash
5: natpan:x:1002:100::/data/natpan:/bin/bash
6: nagios:x:1003:100::/home/nagios:/bin/bash
7: nagios:x:1003:100::/home/nagios:/bin/bash
8: nagios:x:1003:100::/home/nagios:/bin/bash
mqq@wsd_207_62_sles10sp1:~/alenzhou/shell_test/sed>
空行不打印行号,做一下匹配就行
> sed ’/./=’ passwd | sed ’/./N;s/\n/: /g’
1: uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
3: mqq:x:1000:100::/usr/local/app:/bin/bash
4: mysql:x:1001:1001::/home/mysql:/bin/bash
5: natpan:x:1002:100::/data/natpan:/bin/bash
6: nagios:x:1003:100::/home/nagios:/bin/bash
7: nagios:x:1003:100::/home/nagios:/bin/bash
8: nagios:x:1003:100::/home/nagios:/bin/bash

sed的N;P用法的更多相关文章

  1. linux sed命令参数及用法详解

    linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...

  2. shell编程系列9--文本处理三剑客之sed概述及常见用法总结

    shell编程系列9--文本处理三剑客之sed概述及常见用法总结 sed的工作模式:对文本的行数据一行行处理,如下图 sed(stream editor),是流编辑器,依据特定的匹配模式,对文本逐行匹 ...

  3. Linux sed 和 awk的用法

    sed用法: 原文链接:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管 ...

  4. 10 sed命令的基本用法

    grep灵活的关联正则表达式实现文件过滤,而sed是一个数据流的编辑器,或者说是一个行编辑器,它将文件一行一行的数据放入到内存中进行编辑,而awk是一个报告生成器,这个我们以后再说: 之前我们介绍过g ...

  5. sed工具的基本用法

    sed文本处理工具的用法: 用法1:前置命令 | sed [选项] '条件指令' 用法2:sed [选项] '条件指令' 文件.. .. 认识sed工具的基本选项 sed命令的常用选项如下: -n(屏 ...

  6. sed知识及常用用法梳理

    1.sed命令简介及其参数说明 sed流编辑器,擅长对文本进行增删改查,过滤指定的字符串和取指定行,也可以在行中字符串前后插入内容,功能非常强大. 注意:sed默认只支持基本的正则表达式,如果要想支持 ...

  7. sed的实际用法举例

    sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上 ...

  8. sed的基本用法

    了解sed的基本参数 sed匹配的方法: '//'p, 此符号与grep的引号类似,但sed是一定加此符号的,且还要加上-n的参数,匹配起来相当麻烦.sed匹配的方法: '//'pI 加上I的参数是指 ...

  9. sed 简单用法

    sed的一个简单用法: eg:在某一个文件中的一个aaa字段前后添加某些字段. 在aaa前面添加字段:sed -ne 's/aaa/&HELLO/p' test 输出结果:aaaHELLO 在 ...

随机推荐

  1. 支付宝pc网页支付

    本文讲解如何在pc网页上完成支付宝的支付功能, 详细讲解了支付宝的配置信息,项目如何使用配置信息等, 本项目中代码可以直接运行, 也可以将代码迁移至你自己的项目中直接使用. 注意: 下面讲解的功能只能 ...

  2. js--Dom Bom操作

    –      基础 –     内置对象 ● String对象:处理所有的字符串操作 ● Math对象:处理所有的数学运算 ● Date对象:处理日期和时间的存储.转化和表达 ● Array对象:提供 ...

  3. Eclipse卡顿,内存猛增解决方案

    本文转载自http://rsy.iteye.com/blog/2095668/ PS:所有校验都去除后,对如下版本来说,内存一直猛增,解决办法参照上放博客:修改项目的.project文件,特此备注记录 ...

  4. 信息学奥赛一本通算法(C++版)基础算法:高精度计算

    高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...

  5. 洛谷 P1876 开灯(思维,枚举,规律题)

    P1876 开灯 题目背景 该题的题目是不是感到很眼熟呢? 事实上,如果你懂的方法,该题的代码简直不能再短. 但是如果你不懂得呢?那...(自己去想) 题目描述 首先所有的灯都是关的(注意是关!),编 ...

  6. [bzoj2157]旅游 (lct)

    这个应该也算裸的模板题吧..主要是边权的问题,对于每条边u->v,我们可以新建一个节点代替他,把边的信息弄到新的点上,就变成u->x->v了... 当然了这样的话要防止u和v这些没用 ...

  7. android小说阅读源码、bilibili源码、MVP新闻源码等

    Android精选源码 一款基于 MVP+RxJava2+Retrofit2 的应用--熊猫眼 android 五子棋源码分享 android实现全国地图点击效果 android实现立体图案绘制的代码 ...

  8. [国嵌攻略][072][Linux应用程序地址布局]

    程序构成 代码段.数据段.BSS段(Block Started by Symbol,又叫:未初始化数据段).堆(heap)和栈(stack).这些部分构成了Linux应用程序的重要组成部分. 内存布局 ...

  9. 属性getter和setter

    我们知道,对象属性是由名字.值和一组特性(attribute)构成的.在ECMAScript5 中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter.由getter和sette ...

  10. 算法-java代码实现归并排序

    归并排序 对于一个int数组,请编写一个归并排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...