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
這樣,就符合以前的要求,通常這三個能夠作一個循環,以至不會把最後一個符合要求的給漏掉