sed中的N,P,D

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

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

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

我的以为,P与D是相反的,第一打印出第一行,一个打印出第二行(在只匹配两行的状况下)file

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

#cat file文件

abc1co

defg1ab

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

这样,就符合以前的要求,通常这三个能够作一个循环,以至不会把最后一个符合要求的给漏掉

相关文章
相关标签/搜索