在進入正題之前我們先來瞭解一下sed的模式空間,如下 什麼是sed的模式空間? 答(僅供參考):就是從文件讀取一行文本然後存入的緩衝區,然後命令操作模式空間的內容,在初始狀態下模式空間是沒有內容的,在每次迴圈讀取數據的過程中,模式空間都會被清空並寫入新的內容。 解釋以下命令結果: seq 10 | ...
在進入正題之前我們先來瞭解一下sed的模式空間,如下
什麼是sed的模式空間?
答(僅供參考):就是從文件讀取一行文本然後存入的緩衝區,然後命令操作模式空間的內容,在初始狀態下模式空間是沒有內容的,在每次迴圈讀取數據的過程中,模式空間都會被清空並寫入新的內容。
解釋以下命令結果:
- seq 10 | sed 'n;p'
- seq 10 | Sed -n 'n;p'
- seq 10 | sed 'p;n'
- seq 10 | sed -n p;n'
要進一步理解sed的工作原理,弄清上面四個命令便足夠了,大家不妨猜一下上面四條命令的輸出結果......
不知道大家有沒有猜對,不過結果如下:
我想應該不少人都會對上面的結果產生困惑,為了照顧到大部分人,我儘量啰嗦一點吧,如下
第一個命令:seq 10 | sed 'n;p'
解:命令“ seq 10 ”按順序生成 1 到 10 的 10 行數據,通過管道命令“ | ”把結果傳給 sed 命令來處理,
命令“ sed 'n;p' ”就會依次按行讀入管道|傳過來的數據,
第一輪 sed :
seq 把生成的“ 1 ”傳給 sed ,現在 sed 的處理緩衝區就有數據“ 1 ”,有了數據“ 1 ”之後 sed 便執行單引號里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了(我一開始也搞不清楚),其實n命令就是讀入下一行數據,在“ seq 10 | sed 'n;p' ”這裡就是讀入“ 2 ”,那原來的“ 1 ”怎麼辦呢(關鍵),sed會預設把不要的數據丟到stdout(標準輸出,也就是屏幕)那裡,所以就會在屏幕上列印出第一行數據“ 1 ”;得到了第一個輸出然後命令還沒結束!
剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 2 ”,所以直接列印“ 2 ”,現在我們的屏幕就有了2行數據了,分別是第一行:1,第二行:2
第一輪 sed 'n;p' 執行完畢。
第二輪 sed :
與上面上第一輪的差不多,如下:
seq 把生成的“ 3 ”傳給 sed (是 3 不是 2, 不要亂了),(關鍵)sed 的緩衝區裡面現在有“ 2 ”’,然後現在又讀入了新的“ 3 ”,sed會預設把不要的數據(在這裡就是 2 )丟到標準輸出,所以這時屏幕列印第三行數據“ 2 ”,所以現在 sed 的處理緩衝區就有數據“ 3 ”,有了數據“ 3 ”之後 sed 便執行單引號里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了(我一開始也搞不清楚),其實n命令就是讀入下一行數據,在“ seq 10 | sed 'n;p' ”這裡就是讀入“ 4 ”,那原來的“ 3 ”怎麼辦呢(關鍵),sed會預設把不要的數據丟到stdout(標準輸出,也就是屏幕)那裡,所以就會在屏幕上列印出第四行數據“ 3 ”;得到了第四個輸出然後命令還沒結束!
剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 4 ”,所以直接列印“ 4 ”,現在我們的屏幕就有了5行數據了,分別是第一行:1,第二行:2,第三行:2,第四行:3,第五行:4
第二輪 sed 'n;p' 執行完畢。
剩下來的都和上面一樣我就不啰嗦了(第一次寫這麼多,有點累了-_-||)
以上就是對 seq 10 | sed 'n;p' 命令的詳細分析
再貼一次結果:
第二個命令:seq 10 | sed -n 'n;p'
第二個命令與第一個命令幾乎一樣,只是 sed 多了一個選項 -n ,(相信只要理解了第一個命令,現在這個就so easy了)
首先理解 -n 的意思,就是只列印處理過的數據,在這裡再通俗點說就是sed緩衝區里不要的數據就不要丟到標準輸出了,你愛丟哪丟哪!
下麵過一遍流程:
第一輪 sed :
seq 把生成的“ 1 ”傳給 sed ,現在 sed 的處理緩衝區就有數據“ 1 ”,有了數據“ 1 ”之後 sed 便執行單引號里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了(我一開始也搞不清楚),其實n命令就是讀入下一行數據,在“ seq 10 | sed -n 'n;p' ”這裡就是讀入“ 2 ”,那原來的“ 1 ”怎麼辦呢(關鍵),這時 sed 就不會把“ 1 ”丟到標準輸出了,所以屏幕上不會輸出“ 1 ”,
剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 2 ”,所以直接列印“ 2 ”,現在我們的屏幕就有1行數據了,第一行:2
第一輪 sed 'n;p' 執行完畢。
第二輪 sed :
與上面上第一輪的差不多,如下:
seq 把生成的“ 3 ”傳給 sed ,(關鍵)sed 的緩衝區裡面現在有“ 2 ”’,然後現在又讀入了新的“ 3 ”,這時 sed 就不會把“ 2 ”丟到標準輸出了,所以屏幕上不會輸出“ 2 ”,所以現在 sed 的處理緩衝區就有數據“ 3 ”,有了數據“ 3 ”之後 sed 便執行單引號里的“ n;p ”命令
n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了,其實n命令就是讀入下一行數據,在“ seq 10 | sed 'n;p' ”這裡就是讀入“ 4 ”,那原來的“ 3 ”怎麼辦呢(關鍵),sed 也不會把“ 2 ”丟到標準輸出了,所以屏幕上也不會輸出“ 2 ,”然後命令還沒結束!
剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 4 ”,所以直接列印“ 4 ”,現在我們的屏幕就有了5行數據了,分別是第一行:2,第二行:4
第二輪 sed 'n;p' 執行完畢。
再貼一次結果:
相信看到這裡的童鞋都應該有所收穫了,如果沒有那一定是我的問題,對不起!!!
剩下兩個命令我覺得就沒有必要再啰嗦了,相信大家可以自行推導,如果還有什麼不懂的可以私信我,看到就回!
第一次碼這麼多字,希望能對大家有所幫助,在此特地感謝李老師的講解,可以說全是他的深入講解的功勞!!!
碼字不易,你們的是激勵我繼續分享的動力,如果有任何問題,歡迎評論區留言!