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