Sed管理模式
我們已經討論了使用模式和保持緩衝區。現在我們就來探討更多關於它們使用的例子。
n 命令
n命令打印出模式緩衝區的內容,清除模式緩衝器,讀取下一行到模式緩衝區,並在其上施加命令。下麵給出的是 n命令的語法。
[address1[,address2]]n
下麵是一個使用它打印指定的文件的內容n命令一個簡單的例子:
[jerry]$ sed 'n' books.txt
當執行上麵的代碼,它會列出下來的文件 books.text 內容:
1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864
讓我們考慮有n個前3個 sed命令和正經過兩個sed命令如下:
Sed command #1 Sed command #2 Sed command #3 n command Sed command #4 Sed command #5
這裡,Sed應用於前三個命令對模式緩衝存儲器,清除模式緩衝器,讀取下一行到模式緩衝區,然後添加在第四和第五指令就可以了。
保持緩衝器保存的數據,但用sed命令不能在保持緩衝器直接應用。因此,我們需要使保持緩衝器數據轉換成模式緩衝區。Sed提供了x 命令模式和保持緩衝區的內容。下麵的命令說明x命令。
讓我們稍微修 改books.txt 文件。該文件包含書名其次是它們的作者名稱如下:
A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho A Game of Thrones George R. R. Martin
讓我們交換兩個緩衝區的內容。例如,下麵的示例打印的作者隻名稱。
[jerry]$ sed -n 'x;n;p' books.txt
在執行上麵的代碼,會得到如下結果:
George R. R. Martin J. R. R. Tolkien Paulo Coelho J. R. R. Tolkien Paulo Coelho George R. R. Martin
讓我們來了解此命令的工作原理。
-
最初,Sed讀取第一行,即A Storm of Swords入模式緩衝區中。
-
x 命令移動該行保持緩衝區。
-
n 讀取下一行,即,George R. R. Martin到模式緩衝區。
-
將控製傳遞到該命令後跟n打印出模式緩衝區的內容。
-
這個過程一直重複,直到文件被讀完。
現在讓我們印刷,這將導致印刷書籍的標題前交換緩衝區的內容。
[jerry]$ sed -n 'x;n;x;p' books.txt
執行上麵的代碼,得到如下結果:
A Storm of Swords The Two Towers The Alchemist The Fellowship of the Ring The Pilgrimage A Game of Thrones
h 命令
h命令處理保持緩衝區。從模式緩衝區,以保持它的緩衝區拷貝數據。從保持現有的緩存數據被覆蓋。需要注意的是-h命令不動的數據,它隻是複製數據。因此,複製的數據保持,因為它是在模式緩衝區。下麵給出的是-h命令的語法。
[address1[,address2]]h
下麵的命令打印標題-作家Paulo Coelho。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt
執行上麵的代碼,得到如下結果:
The Alchemist The Pilgrimage
H 命令
h命令破壞了保持緩衝器以前的內容。這並不總是可以接受的,因為有時我們需要保留的內容。為了這個目的,sed提供了通過添加一個新行,在所述端部追加的內容,以保持緩衝器為H命令。 h和H的命令之間的唯一差彆是,保持緩衝器前者重寫數據,而後來的數據追加到保持緩衝器。它的語法類似於這是如下的h命令:
[address1[,address2]]H
讓我們再舉一個例子。而不是僅打印書名這一次,打印其作者的名字了。下麵的例子打印書名後麵的作者姓名。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt
執行上麵的代碼,得到如下結果:
The Alchemist Paulo Coelho The Pilgrimage Paulo Coelho
g 命令
我們學會了如何複製/追加模式緩衝區中的內容保存緩衝區。我們可以執行相反的功能呢?肯定是的!為了這個目的,Sed提供 g 命令其副本從保持緩衝器到模式緩衝區中的數據。而複製,從模式空間現有的數據被覆蓋。下麵給出了g命令的語法。
[address1[,address2]]g
讓我們考慮相同的例子- 在打印的書名和作者。這一次,我們將首先打印的作者和下一行,相應的題書的名字。下麵的命令打印的作者Paulo Coelho,其次是它的書名的名字。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt
執行上麵的代碼,會得到如下結果:
Paulo Coelho The Alchemist Paulo Coelho The Pilgrimage
G 命令
同樣,我們可以追加保持緩衝器中的內容到模式緩衝區。Sed提供G指令它通過添加一個新行,在末尾追加內容到圖案緩衝區。它的語法是類似於g命令是如下:
[address1[,address2]]G
現在,就讓我們來它打印的作者Paulo Coelho隨後其書名名稱前麵的例子。為了達到同樣的效果,請執行以下sed命令。
[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt
執行上麵的代碼,會得到如下結果:
Paulo Coelho The Alchemist Paulo Coelho The Pilgrimage
可以修改上麵的例子中,隻需更換G指令之前,緩衝區的內容如下顯示書名後麵他們的作者:
[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt
執行上麵的代碼,會得到如下結果:
The Alchemist Paulo Coelho The Pilgrimage Paulo Coelho