zoukankan      html  css  js  c++  java
  • sed中的N,P,D

    N 把匹配的行写入保持空间,可个觉得可以理解为把匹配到的行写入一个新的文件中,这样会比较好理解,行与行之前用以用.*匹配到" ",或者是直接用" "直接      进行匹配,平时在模式空间(可能理解为你要处理的文字,如你是一个file里面的文字),".* "是不能匹配到" "的

    P 大写p,把模式空间中匹配到的行写入到保持空间,但只输出匹配到的行或者是部分,即成功匹配到两行,但只输出第一行

    D 道理跟P相似,把匹配到的,模式空间的行写入保持空间,但只删匹配到的部分,不删匹配到的第二行或者是部分,即成功匹配到两行,但只删除第一行

    个人觉得,P与D是相反的,第一打印出第一行,一个打印出第二行(在只匹配两行的情况下)

    结合例子说明,下面的file内容,如果直接复制到linux的文件里有,行与行之间是有一个空行的,可以sed -i '/^$/d'  file去空行

    #cat file

    abc1

    defg1

    abc2

    defg2

    abc3

    defg3

    abc4

    abc5

    defg4

    1.打印出第一行有abc,第二行有defg的第一行,总共匹配两行,如果成功匹配到这两行,就只打印出第一行

    #sed -n '/abc/ {N;/abc.*defg/p}' file

    abc1
    abc2
    abc3

    这里注意了,最后面三行,并没有匹配出来,这很奇怪,后面再讲

    2.删除第一行有abc,第二行有defg中的第一行,总共匹配两行,如果成功匹配到这两行,就打印出第二行

    #sed   '/abc/ {N;/abc.*defg/D}' file

    defg1
    defg2
    defg3
    abc4
    abc5
    defg4

    还是很奇怪吧,第四和第五行又出来了,如果要让他们不出来,下面再来讲讲

    一般无论是P还是D,都只匹配到倒数第二个能匹配到的,如果想要最后一个都能匹配到,就得把N , P , D结合起来用

    3.还是跟1.的要求一样,不过这次要求abc5也要出来

    #sed -n '/abc/{N;/abc.*defg/P;D}' file

    abc1
    abc2
    abc3
    abc5

    这样,就符合之前的要求,一般这三个可以做一个循环,以致不会把最后一个符合要求的给漏掉

  • 相关阅读:
    linux命令(14):ifup/ifdown/ip addr命令
    linux命令(13):kill/killall命令
    linux命令(12):ping命令
    linux命令(11):df命令
    linux命令(9):route命令
    npm安装node-sass报msbuild相关错误的解决办法
    'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    redis发布与订阅的实现
    设计模式-工厂模式
    设计模式的介绍
  • 原文地址:https://www.cnblogs.com/2myroad/p/3916397.html
Copyright © 2011-2022 走看看