讓我們討論 n 命令,該命令打印模式空間。它將與其他命令結(jié)合使用。下面給出的是 n 命令的語(yǔ)法。
[address1[,address2]]n
讓我們舉個(gè)例子。
$sed 'n' books.txt
執(zhí)行以上代碼后,將產(chǎn)生以下輸出:
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 命令將打印模式緩沖區(qū)的內(nèi)容,清除模式緩沖區(qū),將下一行提取到模式緩沖區(qū)中,并在其上應(yīng)用命令。
讓我們考慮 n 之前的三個(gè)SED命令和 n 之后的兩個(gè)SED命令,如下所示:
Sed command #1 Sed command #2 Sed command #3 n command Sed command #4 Sed command #5
在這種情況下,SED在模式緩沖區(qū)上應(yīng)用前三個(gè)命令,清除模式緩沖區(qū),將下一行提取到模式緩沖區(qū)中,然后在其上應(yīng)用第四和第五個(gè)命令。
SED提供 x 命令來(lái)交換模式和保持緩沖區(qū)的內(nèi)容。以下命令說(shuō)明了 x 命令。
讓我們稍微修改books.txt文件。說(shuō),該文件包含書(shū)名及其作者姓名。修改后,文件應(yīng)如下所示:
$cat books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
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)容。例如,以下示例僅打印作者的姓名。
$sed -n 'x;n;p' books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
George R. R. Martin J. R. R. Tolkien Paulo Coelho J. R. R. Tolkien Paulo Coelho George R. R. Martin
現(xiàn)在讓我們?cè)诖蛴≈敖粨Q緩沖區(qū)的內(nèi)容。猜猜,會(huì)發(fā)生什么?是的,它會(huì)打印書(shū)籍的標(biāo)題。
$sed -n 'x;n;x;p' books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
A Storm of Swords The Two Towers The Alchemist The Fellowship of the Ring The Pilgrimage A Game of Thrones
h 命令處理保留緩沖區(qū),它將數(shù)據(jù)從模式緩沖區(qū)復(fù)制到保持緩沖區(qū),保留緩沖區(qū)中的現(xiàn)有數(shù)據(jù)將被覆蓋。請(qǐng)注意, h 命令不會(huì)移動(dòng)數(shù)據(jù),它只會(huì)復(fù)制數(shù)據(jù)。因此,復(fù)制的數(shù)據(jù)將保留在模式緩沖區(qū)中。下面給出的是 h 命令的語(yǔ)法。
[address1[,address2]]h
以下命令僅打印作者Paulo Coelho的標(biāo)題。
$sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
The Alchemist The Pilgrimage
讓我們了解以上命令的工作原理。 books.txt的內(nèi)容采用特定格式。第一行是書(shū)名,其后是書(shū)的作者。在上面的命令中,"!"用于反轉(zhuǎn)條件,即僅當(dāng)模式匹配失敗時(shí)才將行復(fù)制到保持緩沖區(qū)?;ɡㄌ?hào){}用于對(duì)多個(gè)SED命令進(jìn)行分組
h 命令破壞保留緩沖區(qū)的先前內(nèi)容。為此,SED提供了 H 命令,該命令通過(guò)在末尾添加新行來(lái)將內(nèi)容附加到保持緩沖區(qū)。 h 和 H 命令之間的唯一區(qū)別是,前者覆蓋保留緩沖區(qū)中的數(shù)據(jù),而后者將數(shù)據(jù)追加到保留緩沖區(qū)中。它的語(yǔ)法類(lèi)似于 h 命令。
[address1[,address2]]H
讓我們?cè)倥e一個(gè)例子。這次,不僅打印書(shū)名,還打印其作者的姓名。以下示例打印書(shū)名及其作者姓名。
$sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
The Alchemist Paulo Coelho The Pilgrimage Paulo Coelho
我們學(xué)習(xí)了如何將模式緩沖區(qū)的內(nèi)容復(fù)制/追加到保持緩沖區(qū)。我們還能執(zhí)行反向函數(shù)嗎?是的,當(dāng)然了!為此,SED提供了 g 命令,該命令將數(shù)據(jù)從保持緩沖區(qū)復(fù)制到模式緩沖區(qū)。復(fù)制時(shí),來(lái)自模式空間的現(xiàn)有數(shù)據(jù)將被覆蓋。下面給出的是 g 命令的語(yǔ)法。
[address1[,address2]]g
讓我們考慮相同的示例-打印書(shū)名及其作者。這次,我們將首先打印作者的姓名,并在下一行上打印相應(yīng)的書(shū)名。以下命令顯示作者Paulo Coelho的姓名,以及其書(shū)名。
$sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
Paulo Coelho The Alchemist Paulo Coelho The Pilgrimage
同樣,我們可以將保持緩沖區(qū)的內(nèi)容附加到模式緩沖區(qū)。 SED提供 G 命令,該命令通過(guò)在末尾添加新行來(lái)將內(nèi)容附加到模式緩沖區(qū)。
[address1[,address2]]G
現(xiàn)在,讓我們以前面的示例為例,該示例將作者Paulo Coelhofolol的名字印在書(shū)名的后面。要獲得相同的輸出,請(qǐng)執(zhí)行以下SED命令。
$sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
Paulo Coelho The Alchemist Paulo Coelho The Pilgrimage
您可以修改上面的示例以顯示其作者之后的書(shū)名嗎?很簡(jiǎn)單,只需在 G 命令之前交換緩沖區(qū)內(nèi)容。
$sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt
執(zhí)行上述代碼后,您將得到以下輸出:
The Alchemist Paulo Coelho The Pilgrimage Paulo Coelho