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

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

原文地址:https://www.cnblogs.com/2myroad/p/3916397.html