当前位置:   article > 正文

sed的N;P用法

sed np用法

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\n;sed再从文件中读取下一行,发现没有了,结束处理流程。对于小p,和d大P的区别了解的话也就不难理解了。
  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\n;sed继续再读取文件的时候没有数据,所以结束处理。
  76. 验证3:NpD,再验证
  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

转载于:https://www.cnblogs.com/irockcode/p/8018663.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/322930
推荐阅读
相关标签
  

闽ICP备14008679号