sed的N;P用法

原文地址

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

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

  1. 蒙受启发
  2. > cat num
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. > sed N;$!D num
  13. 8
  14. 9
  15. >
  16. 执行过程详解:
  17. 首先解释重要的几个命令的用途:
  18. D删除模板块的第一行 并返回脚本头部执行
  19. $ 锚定行的结束 如:/sed$/匹配所有以sed结尾的行 ,继续执行
  20. ! 表示后面的命令对所有没有被选定的行发生作用。
  21. 大概说一下:
  22. N;$!D
  23. 首先读入第一行: 1 (注:这不是N命令读入的)
  24. 执行N,读入第2行,追加到1后面,成了1\n2;
  25. $!D,不是最后一行,所以执行D,模式空间由1\n2成了2, 控制流返回脚本第一条命令,即N。这样一直执行
  26. ….
  27. 直到执行N读入第9行:9,这里模式空间为:8\n9
  28. $!D,因为是最后一行,所以不执行D,控制流到达脚本底部,输出模式空间的内容:
  29. 8
  30. 9
  31. 上面这段例子摘自网络,给了我很大启发,另外测试如下:
  32. 关于N
  33. append the next line of input into the pattern space. 这是sed用户手册当中说的,很明显,意思是将当前读入行的下一行读取到当前的模式空间。
  34. 关于P
  35. Print up to the first embedded newline of the current pattern space.打印当前模式空间中的第一块。
  36. 关于D
  37. 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.
  38. 删除当前模式空间的第一块,重新开始下一次循环,这个在后面例子中给予验证:
  39. 各种验证
  40. 验证一:NP结合
  41. > cat num
  42. 1
  43. 2
  44. 3
  45. 4
  46. > sed N;P num
  47. 1
  48. 1
  49. 2
  50. 3
  51. 3
  52. 4
  53. > sed N;p num
  54. 1
  55. 2
  56. 1
  57. 2
  58. 3
  59. 4
  60. 3
  61. 4
  62. 对于上面的结果给予解释:P用于打印当前模式空间的第一块,而p打印整个当前模式空间。所以当使用P的时候,步骤如下:首先sed默认的读取1,模式空间为1,让你后执行N,模式空间变成1\n2\n,然后执行P,也就是打印1\n;当前行的处理,打印模式空间也就是1\n2\n;这时sed再从文件中读取下一行,也就到了3\n,执行N;模式空间变成了3\n4\n;
  63. 执行P;打印3\n;继续执行当前行的处理,打印模式空间3\n4\nsed再从文件中读取下一行,发现没有了,结束处理流程。对于小p,和dP的区别了解的话也就不难理解了。
  64. 验证二:ND结合
  65. > cat num
  66. 1
  67. 2
  68. 3
  69. 4
  70. > sed N;D num
  71. 4
  72. > sed N;d num
  73. >
  74. 对于D;删除当前模式空间第一块,并且返回命令开始继续执行。上述结果解释如下:
  75. 首先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\nsed继续再读取文件的时候没有数据,所以结束处理。
  76. 验证3NpD,再验证
  77. > cat num
  78. 1
  79. 2
  80. 3
  81. 4
  82. > sed N;p;D num
  83. 1
  84. 2
  85. 2
  86. 3
  87. 3
  88. 4
  89. 4
  90. 首先,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遍。
  91. 另外d和大D的区别了解以后也就明白了。
  92. 总结体会:sed处理始终在一个模式空间中进行,而且对于待处理文件,N读取了文件中的一行后,sed继续处理的时候应该是接着去读取,这里我理解是sed读取文件和N读取文件这些的共用一个指针。
  93. sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
  94. 常用命令:
  95. 利用sed给每行添加行号。
  96. > cat passwd
  97. uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
  98. mqq:x:1000:100::/usr/local/app:/bin/bash
  99. mysql:x:1001:1001::/home/mysql:/bin/bash
  100. natpan:x:1002:100::/data/natpan:/bin/bash
  101. nagios:x:1003:100::/home/nagios:/bin/bash
  102. nagios:x:1003:100::/home/nagios:/bin/bash
  103. nagios:x:1003:100::/home/nagios:/bin/bash
  104. 给每行加上行号,命令如下:
  105. > sed = passwd | sed N;s/\n/: /g
  106. 1: uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
  107. 2:
  108. 3: mqq:x:1000:100::/usr/local/app:/bin/bash
  109. 4: mysql:x:1001:1001::/home/mysql:/bin/bash
  110. 5: natpan:x:1002:100::/data/natpan:/bin/bash
  111. 6: nagios:x:1003:100::/home/nagios:/bin/bash
  112. 7: nagios:x:1003:100::/home/nagios:/bin/bash
  113. 8: nagios:x:1003:100::/home/nagios:/bin/bash
  114. mqq@wsd_207_62_sles10sp1:~/alenzhou/shell_test/sed>
  115. 空行不打印行号,做一下匹配就行
  116. > sed ’/./=’ passwd | sed ’/./N;s/\n/: /g
  117. 1: uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
  118. 3: mqq:x:1000:100::/usr/local/app:/bin/bash
  119. 4: mysql:x:1001:1001::/home/mysql:/bin/bash
  120. 5: natpan:x:1002:100::/data/natpan:/bin/bash
  121. 6: nagios:x:1003:100::/home/nagios:/bin/bash
  122. 7: nagios:x:1003:100::/home/nagios:/bin/bash
  123. 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. Nginx的虚拟服务器域名配置

    虚拟服务器名(server name)是通过指令server_name来指定的.在< Nginx是如何处理Request的?>一节中,我们讲到nginx分两步来匹配过来的Request请求 ...

  2. #pta循环作业

    7-7 计算阶乘和 1.题目 . 2.设计思路     此题目比一道类似的经典题目的区别就是不是直接的数字累加而是每次的数字先累乘之后再累加 只需要在累加之前处理一下所要加的数字就可以实现了 3.流程 ...

  3. Spring MVC 详解之废话少说

    <陈翔六点半之废话少说>.... Spring WEB MVC 的请求流程: Spring WEB MVC架构: 开始创建.配置gradle项目 1.在gralde项目中,选择SDK 和框 ...

  4. PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)

    1.flush - 刷新输出缓冲 2.ob_clean - 清空(擦掉)输出缓冲区 此函数用来丢弃输出缓冲区中的内容. 此函数不会销毁输出缓冲区,而像 ob_end_clean() 函数会销毁输出缓冲 ...

  5. 关于python使用cv画矩形并填充颜色同时填充文字

    font = cv2.FONT_HERSHEY_SIMPLEX # 使用默认字体 cv2.rectangle(im, (10, 10), (110, 110), (0, 0, 255), thickn ...

  6. java调用c++函数的简单笔记

    java使用jni调用c++动态库函数. 步骤: 1.编写java测试代码如下: public class CallNativeDemo { native void func(); native do ...

  7. grid搜索最优参数

    GridSearchCV 详细地址:http://scikit-learn.org/stable/modules/generated/sklearn.grid_search.GridSearchCV. ...

  8. cs231n spring 2017 lecture3 Loss Functions and Optimization 听课笔记

    1. Loss function是用来量化评估当前预测的好坏,loss function越小表明预测越好. 几种典型的loss function: 1)Multiclass SVM loss:一般的S ...

  9. 互联网App应用程序测试流程及测试总结

    互联网App应用程序测试流程及测试总结 1. APP测试基本流程 1.1流程图 仍然为测试环境 Pass 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日 ...

  10. Docker版本升级至17.03

    2017/3/3,Docker官方发表了一篇博客,Docker版本从1.13.*直接跳入17.03,该版本的意思是17年3月.同时,还声明了Docker以后会以CE(Community Edition ...