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

這樣,就符合以前的要求,通常這三個能夠作一個循環,以至不會把最後一個符合要求的給漏掉

相關文章
相關標籤/搜索