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