sed之N和 N的區別和運用

2021-10-04 21:17:51 字數 1516 閱讀 7665

這個問題我相信很多同學困擾了很久,懂的大師們早已熟練於心,不懂的小鳥們百思不解。今天我就徹底的分析透徹這2個命令的區別,和在什麼場合下使用。我們首先看看它們的區別:

$ seq 512

345$ seq 5 |

sed -n 'n;p'

#命令⑴13

$ seq 5 |

sed -n '$!n;p'

#命令⑵13

5

n的作用是讀取下一行的內容到模式空間(pattern space)閣下可以理解為sed這時候把兩行讀入成中間帶\n的一行內容,原本sed的執行原理是逐行讀取到模式空間,n呢就促使sed把下一行內容也同時讀取到模式空間待命。

命令⑴:這時候n就讓sed把1、2行同時讀入了模式空間,p是列印模式空間第一行內容,這時候1就輸出到了螢幕,接著讀入3、4行輸出3到螢幕上,到了最後一行第5行,為什麼沒有輸出呢?

原來n還有另外乙個特性:當無法處理下一行內容時,n則會中止退出,所以後面的命令也不會再執行。這就不難解釋為什麼沒有輸出第5行了,到了最後一行已經沒有下一行處理了,所以n就退出命令,後面的p也不會執行。

命令⑵:$!n 對最後一行不再執行n命令,則會繼續執行命令p,列印模式空間的第一行,5就輸出到了螢幕。那麼下面的命令怎麼又沒有區別呢?

$ seq 5 |

sed'n;s/\n/ /'

#命令⑶

1 23 4

5$ seq 5 |

sed'$!n;s/\n/ /'

#命令⑷

1 23 4

5

為什麼呢?

大家注意觀察該sed沒有引數-n,原因就在這裡,sed是預設輸出模式空間裡的內容,當執行到最後一行時。

命令⑶:n無法處理下一行內容,就退出了命令,不執行後面的替換語句,但是sed缺省會輸出該行內容,所以5仍然輸出到了螢幕上。

命令⑷:到了最後一行,n沒起作用,後面的替換執行也是不成功的,但sed還是會預設輸出該行內容,5也出現在了螢幕上,最後兩個命令的結果一樣,但是過程是不一樣的。

我再重複一下:命令⑶執行到最後一行時n中止了命令,sed預設輸出了該行內容,而命令⑷則執行了後面的替換動作,只是替換不成功沒起到任何作用,sed也仍然輸出了該行內容。大家明白了嗎?我們也可以加 -n 引數就可以看出差別了:

$ seq 5 |

sed -n 'n;s/\n/ /;p'

1 23 4

$ seq 5 |

sed -n '$!n;s/\n/ /;p'

1 23 4

5

加了 -n 引數後,n中止了命令,後面的p也沒有執行,所以第5行沒有輸出,而 $!n 會對最後一行不操作,n沒有起作用,所以沒有中斷後面的語句執行,p把5輸出到了螢幕上。

看完這篇博文的同學我想已經徹底搞清楚了n的作用了,謝謝大家對我部落格的關注。好記性不如爛筆頭_

n 和 r的區別

n 是換行,r是回車 在計算機還沒有出現之前,有一種叫做電傳打字機 teletype model 33 的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。於是,研製人員想了個辦法...

r n和 n的區別

r 是回車,return n 是換行,newline 我們在平時使用電腦時,已經習慣了回車和換行一次搞定,敲乙個回車鍵,即是回車,又是換行,但在早期的打字機上,要另起一行打字需要兩個步驟,首先要傳送命令 r 將打字頭復位,即回車,然後再傳送命令 n 讓打字機走紙移到下一行,所以這個歷史遺留問題導致了...

r和 n的區別

r return 到當前行的最左邊。n newline 向下移動一行,並不移動左右。linux中 n表示回車 換行 windows中 r n表示回車 換行。mac中 r表示回車 換行。歷史 回車 carriage return 和 換行 line feed 這兩個概念的來歷和區別。在計算機還沒有出現...