N 把匹配的行写入保持空间,可个觉得可以理解为把匹配到的行写入一个新的文件中,这样会比较好理解,行与行之前用以用.*匹配到"\n",或者是直接用"\n"直接 进行匹配,平时在模式空间(可能理解为你要处理的文字,如你是一个file里面的文字),".* "是不能匹配到"\n"的
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
这样,就符合之前的要求,一般这三个可以做一个循环,以致不会把最后一个符合要求的给漏掉