sed以簡潔的語法,與vi一貫的風格,受許多人的衷愛。
sed有許多現成的語句組合,可以提供各種實用的功能,sed模擬tail,將一文件的所有行倒序打印,就是一例。
語句如下:
sed -n 'G;h;$p' this_file
如 this_file
中第1行是 1
,第2行是 2
, … ,第10行是 10
,那麼這條語句將會打印出:
10
9
8
7
6
5
4
3
2
1
看起來很神奇,理解起來其實也很簡單。
首先要知道,sed有兩個緩存區,一個存放讀入的文件當前行的內容,稱爲 pattern buffer
,一個稱作hold space
,可存放一些自定義的內容。
如上面 this_file
,sed讀入第1行的內容 1
,那麼 pattern buffer
的內容就是 1
, G
命令後,pattern buffer
的內容變爲 1\n
, \n
爲換行符, G
命令的作用是把hold space
的內容追加到pattern buffer
後面,然後是命令 ;
, ;
的作用類似於其它語言,不過更爲原始,意爲“繼續將 ;
後面的命令作用於當前的pattern buffer
或hold space
, h
命令將複製pattern buffer
中的內容到hold space
,替換了原來hold space
中的內容,這樣, h
命令之後hold space
的內容就是 1\n
, $p
的作用是在最後一行時打印pattern buffer
中的內容, $
代表最後一行的行號,爲 p
命令指定作用範圍, p
的作用是打印pattern buffer
中的內容。這樣,在第1行,整個命令組合執行完,sed不會有任何輸出,pattern buffer
中的內容是 1\n
,hold space
中的內容也是 1\n
。
然後到第2行,pattern buffer
中的內容是 2
,G
命令把hold space
的內容追加到pattern buffer
後面,那麼 G
命令後pattern buffer
中的內容爲 2\n1\n
, h
命令後hold space
的內容爲 2\n1\n
。如此反覆,到最後一行,pattern buffer
的內容爲 10\n9\n8\n7\n6\n5\n4\n3\n2\n1\n
,這時 h
仍會複製pattern buffer
中的內容到hold space
,不過已沒什麼作用,而 $p
將會執行,打印出pattern buffer
的內容,作爲sed唯一的輸出。
sed的 -n
選項說明不去打印 pattern buffer
的內容。