鍍金池/ 教程/ Linux/ Sed管理模式
Sed字符串
Sed實(shí)用功能
Sed管理模式
sed環(huán)境設(shè)置
sed模式緩沖區(qū)
Sed循環(huán)
Sed模式范圍
Sed教程
Sed正則表達(dá)式
Sed分支
Sed基本語(yǔ)法
sed工作流程
Sed特殊字符
Sed基本命令

Sed管理模式

我們已經(jīng)討論了使用模式和保持緩沖區(qū)?,F(xiàn)在我們就來(lái)探討更多關(guān)于它們使用的例子。

n 命令

n命令打印出模式緩沖區(qū)的內(nèi)容,清除模式緩沖器,讀取下一行到模式緩沖區(qū),并在其上施加命令。下面給出的是 n命令的語(yǔ)法。

[address1[,address2]]n

下面是一個(gè)使用它打印指定的文件的內(nèi)容n命令一個(gè)簡(jiǎn)單的例子:

[jerry]$ sed 'n' books.txt 

當(dāng)執(zhí)行上面的代碼,它會(huì)列出下來(lái)的文件 books.text 內(nèi)容:

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個(gè)前3個(gè) sed命令和正經(jīng)過(guò)兩個(gè)sed命令如下:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

這里,Sed應(yīng)用于前三個(gè)命令對(duì)模式緩沖存儲(chǔ)器,清除模式緩沖器,讀取下一行到模式緩沖區(qū),然后添加在第四和第五指令就可以了。

保持緩沖器保存的數(shù)據(jù),但用sed命令不能在保持緩沖器直接應(yīng)用。因此,我們需要使保持緩沖器數(shù)據(jù)轉(zhuǎn)換成模式緩沖區(qū)。Sed提供了x 命令模式和保持緩沖區(qū)的內(nèi)容。下面的命令說(shuō)明x命令。

讓我們稍微修 改books.txt 文件。該文件包含書(shū)名其次是它們的作者名稱(chēng)如下:

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 

讓我們交換兩個(gè)緩沖區(qū)的內(nèi)容。例如,下面的示例打印的作者只名稱(chēng)。

[jerry]$ sed -n 'x;n;p' books.txt 

在執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin 

讓我們來(lái)了解此命令的工作原理。

  • 最初,Sed讀取第一行,即A Storm of Swords入模式緩沖區(qū)中。

  • x 命令移動(dòng)該行保持緩沖區(qū)。

  • n 讀取下一行,即,George R. R. Martin到模式緩沖區(qū)。

  • 將控制傳遞到該命令后跟n打印出模式緩沖區(qū)的內(nèi)容。

  • 這個(gè)過(guò)程一直重復(fù),直到文件被讀完。

現(xiàn)在讓我們印刷,這將導(dǎo)致印刷書(shū)籍的標(biāo)題前交換緩沖區(qū)的內(nèi)容。

[jerry]$ sed -n 'x;n;x;p' books.txt 

執(zhí)行上面的代碼,得到如下結(jié)果:

A Storm of Swords
The Two Towers
The Alchemist
The Fellowship of the Ring
The Pilgrimage
A Game of Thrones

h 命令

h命令處理保持緩沖區(qū)。從模式緩沖區(qū),以保持它的緩沖區(qū)拷貝數(shù)據(jù)。從保持現(xiàn)有的緩存數(shù)據(jù)被覆蓋。需要注意的是-h命令不動(dòng)的數(shù)據(jù),它只是復(fù)制數(shù)據(jù)。因此,復(fù)制的數(shù)據(jù)保持,因?yàn)樗窃谀J骄彌_區(qū)。下面給出的是-h命令的語(yǔ)法。

[address1[,address2]]h 

下面的命令打印標(biāo)題-作家Paulo Coelho。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt 

執(zhí)行上面的代碼,得到如下結(jié)果:

The Alchemist 
The Pilgrimage

H 命令

h命令破壞了保持緩沖器以前的內(nèi)容。這并不總是可以接受的,因?yàn)橛袝r(shí)我們需要保留的內(nèi)容。為了這個(gè)目的,sed提供了通過(guò)添加一個(gè)新行,在所述端部追加的內(nèi)容,以保持緩沖器為H命令。 h和H的命令之間的唯一差別是,保持緩沖器前者重寫(xiě)數(shù)據(jù),而后來(lái)的數(shù)據(jù)追加到保持緩沖器。它的語(yǔ)法類(lèi)似于這是如下的h命令:

[address1[,address2]]H

讓我們?cè)倥e一個(gè)例子。而不是僅打印書(shū)名這一次,打印其作者的名字了。下面的例子打印書(shū)名后面的作者姓名。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt 

執(zhí)行上面的代碼,得到如下結(jié)果:

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

g 命令

我們學(xué)會(huì)了如何復(fù)制/追加模式緩沖區(qū)中的內(nèi)容保存緩沖區(qū)。我們可以執(zhí)行相反的功能呢?肯定是的!為了這個(gè)目的,Sed提供 g 命令其副本從保持緩沖器到模式緩沖區(qū)中的數(shù)據(jù)。而復(fù)制,從模式空間現(xiàn)有的數(shù)據(jù)被覆蓋。下面給出了g命令的語(yǔ)法。

[address1[,address2]]g

讓我們考慮相同的例子- 在打印的書(shū)名和作者。這一次,我們將首先打印的作者和下一行,相應(yīng)的題書(shū)的名字。下面的命令打印的作者Paulo Coelho,其次是它的書(shū)名的名字。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt 

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

G 命令

同樣,我們可以追加保持緩沖器中的內(nèi)容到模式緩沖區(qū)。Sed提供G指令它通過(guò)添加一個(gè)新行,在末尾追加內(nèi)容到圖案緩沖區(qū)。它的語(yǔ)法是類(lèi)似于g命令是如下:

[address1[,address2]]G

現(xiàn)在,就讓我們來(lái)它打印的作者Paulo Coelho隨后其書(shū)名名稱(chēng)前面的例子。為了達(dá)到同樣的效果,請(qǐng)執(zhí)行以下sed命令。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

可以修改上面的例子中,只需更換G指令之前,緩沖區(qū)的內(nèi)容如下顯示書(shū)名后面他們的作者:

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

執(zhí)行上面的代碼,會(huì)得到如下結(jié)果:

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho 

上一篇:Sed模式范圍下一篇:Sed基本命令